簡體   English   中英

將多維數組作為函數參數傳遞

[英]passing multi-dimentional array as function argument

假設我有兩個二維數組,如下所示:

A [2] [3] = {{1,2,4},{2,5,15}}

如果我將其作為函數參數傳遞

#include <stdio.h>

int fun(int A[][3])  // or int fun( int (*A)[3])
{
.
.
}

main()
{
int A[2][3] = {{1,2,4},{2,5,15}}; 
fun(A); 
}

問)為什么第一個塊可以在函數參數中像[[]這樣是空的,為什么可以保持空?為什么其他人不能像A [] []一樣保持空? 還是為什么這是錯誤的** A作為函數參數?

現在,如果我有一個三維數組,如下所示:

A [2] [3] [4] = {{{2,21,12,34,23},{322,34,34,23},{323,32,112,324}},{{23,231,21,233},{ 23,5,65,2},{3,23,234,34}}}

如果我將其作為函數參數傳遞

#include <stdio.h>

int fun(int A[][3][4])  // or int fun( int (*A)[3][4])
{
.
.
}

main()
{
int A[2][3][4] = {{{2,21,12,34,23},{322,34,34,23},{323,32,112,324}}, {{23,231,21,233},{23,5,65,2},{3,23,234,34}}}

fun(A); 
}

問)為什么第一個塊在函數參數中可以像[[]這樣是空的,為什么可以保持空?為什么其他人不能像A [] [] []一樣保持空? 還是為什么這是錯誤的*** A作為函數參數?

標准說:

可以將類型為“ NT數組”或“ T的未知范圍的數組”的左值或右值轉換為類型為“指向T的指針”的右值。結果是指向數組第一個元素的指針。

簡而言之,它允許將參數int A[x][y][z]轉換為int (A*)[y][z] 我們通常說這樣的數組會衰減為指針。

該標准還說:

僅在指針*與數組[]中不同的參數聲明是等效的。 即,將數組聲明調整為指針聲明(8.3.5)。 在參數類型(8.3.4)中,只有第二維和后續數組維才有意義。

這意味着當用作函數參數時, int (A*)[y][z]int A[][y][z]沒有區別。

因此,可以將int A[x][y][z] (但不能將int A[][][z]int A[][][]等傳遞給需要參數的函數是可以的)輸入int A[][y][z]

為什么需要小尺寸的尺寸? 因為編譯器需要知道A*指向的元素的類型(這里是int [y][z] ),以便它可以正確地執行指針算術。 例如,當您++A時, A's value = A's value + sizeof(int) * y * z

您可以將指針傳遞給任意尺寸的數組作為參數,但是如果您希望編譯器使用它進行指針算術運算,則編譯器將需要知道各種尺寸的大小。 有關更多說明,請參見在C中將多維數組作為函數參數傳遞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM