[英]2D Array and pointer to a pointer
過去試卷中的問題:
“以下哪一個:
int a[4][4], (*b)[4], *c[4], **d;
你能傳遞給一個期望指向int的指針的函數嗎?
int funct(int **);
解釋你的答案。”
答案是c和di相信嗎?
我只是在努力理解為什么其余的都不允許呢?
任何幫助,將不勝感激。
funct
需要一個int **
-即指向一個指向int的指針。 d
從字面上是那樣,所以沒有問題。 c
可以工作,因為它是一個指向int的指針的數組,因此在函數調用上下文中使用時,它會衰減為一個指向int的指針。
a
和b
無效,因為它們不是兼容類型。 a
是一個int數組數組, b
是一個int數組指針。 當作為參數傳遞時, a
將衰減為int數組指針。
如果可以添加一些有關上述答案之間差異的信息。
聲明數組時,此- []
優先級高於此*
。 再加上數組和指針始終可互換(它們不是)的假設,吸引了很多人。
天真地假設int *arr[]
是指向數組的指針,因為從左到右讀取是一個自然的假設。
但是,它實際上是一個整數指針數組。 您想要一個指向數組的指針嗎? 告訴C:
int (*arr)[array_size];
通過設置自己的優先級。
正如Carl解釋的那樣,僅答案c
和d
是適用的,因為在d
情況下,您已經有一個指向指針的指針,在c
情況下,當指針數組作為參數傳遞給函數時,它將衰減為指向指針的指針。
如果您想要一個將讀取a
和b
的函數,則簽名需要更改為以下內容:
int funct(int (*array_name)[array_size]);
請注意,在上面的內容中,您將需要指定指針將指向的數組的大小。
通常,如果將數組傳遞給函數,則將其作為指向數組第一個元素的指針傳遞 ...
將a [4] [4]轉換為一個函數,即fun(a); 它作為int(* p)[4]傳遞,因此fun參數必須是fun(int(* p)[])
這里的第一個元素本身是4個整數的數組
fun(a)---> fun(int(* p)[])
int(* b)[4]是指向4個整數的數組的指針,因此調用fun(b)要求參數必須為fun(int(* pt)[])
fun(b)---> fun(int(* pt)[])
int * c [4]是4個整數指針的數組。因此調用fun(c)要求參數必須是指向數組第一個元素的指針。 這里的第一個元素本身就是一個int指針..so fun(int ** p)
fun(c)---> fun(int ** p)
int ** d是指向int的雙指針。因此調用fun(d)要求參數必須為fun(int ** p)
fun(d)---> fun(int ** p)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.