簡體   English   中英

2D數組和指向指針的指針

[英]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的指針。

ab無效,因為它們不是兼容類型。 a是一個int數組數組, b是一個int數組指針。 當作為參數傳遞時, a將衰減為int數組指針。

如果可以添加一些有關上述答案之間差異的信息。

聲明數組時,此- []優先級高於此* 再加上數組和指針始終可互換(它們不是)的假設,吸引了很多人。

天真地假設int *arr[]是指向數組的指針,因為從左到右讀取是一個自然的假設。

但是,它實際上是一個整數指針數組。 您想要一個指向數組的指針嗎? 告訴C:

int (*arr)[array_size];

通過設置自己的優先級。

正如Carl解釋的那樣,僅答案cd是適用的,因為在d情況下,您已經有一個指向指針的指針,在c情況下,當指針數組作為參數傳遞給函數時,它將衰減為指向指針的指針。

如果您想要一個將讀取ab的函數,則簽名需要更改為以下內容:

int funct(int (*array_name)[array_size]); 

請注意,在上面的內容中,您將需要指定指針將指向的數組的大小。

關於二維數組和此處此處的指針的一些好的答案。

通常,如果將數組傳遞給函數,則將其作為指向數組第一個元素的指針傳遞 ...

  1. 將a [4] [4]轉換為一個函數,即fun(a); 它作為int(* p)[4]傳遞,因此fun參數必須是fun(int(* p)[])
    這里的第一個元素本身是4個整數的數組
    fun(a)---> fun(int(* p)[])

  2. int(* b)[4]是指向4個整數的數組的指針,因此調用fun(b)要求參數必須為fun(int(* pt)[])
    fun(b)---> fun(int(* pt)[])

  3. int * c [4]是4個整數指針的數組。因此調用fun(c)要求參數必須是指向數組第一個元素的指針。 這里的第一個元素本身就是一個int指針..so fun(int ** p)
    fun(c)---> fun(int ** p)

  4. int ** d是指向int的雙指針。因此調用fun(d)要求參數必須為fun(int ** p)
    fun(d)---> fun(int ** p)

暫無
暫無

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

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