[英]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.