2013-06-27 101 views
1

問:二維數組和指針的指針從過去的考卷

「以下哪項:

int a[4][4], (*b)[4], *c[4], **d; 

你能不能傳遞到期待一個指針的指針爲int 功能即

int funct(int **); 

解釋你的答案。「

答案是c和d我相信嗎?

我只是在努力去理解爲什麼其餘的都不允許?

任何幫助,將不勝感激。

+1

你應該閱讀[C FAQ,第6章,數組和指針](http://c-faq.com/aryptr/index.html)。 –

+0

謝謝,我現在要讀它 – user2469515

回答

1

funct需要一個int ** - 也就是一個指針指向一個int。 d是字面意思,所以沒問題。 c也可以工作,因爲它是一個指向int的指針數組,當在函數調用上下文中使用時,它會衰減爲指向指向int的指針。

ab將不起作用,因爲它們不是兼容的類型。 a是一個int數組,而b是一個指向int數組的指針。當作爲參數傳遞時,a將衰減爲指向int數組的指針。

+0

我是否正確,如果我說B不會衰變? – user2469515

+0

是的,這是正確的。這是一個指針 - 只有數組類型拉動了這個技巧。 –

+0

@ user2469515衰退並不是真正的相關問題。 b指向的是4個整數的數組,而想要的是指向'int *'的東西。 b + 1是大於b的4 * sizeof(int)'字節,而不同的是'sizeof(int *)'字節。 –

0

如果我可以添加一些信息上面的答案之間的差異。

這個 - []在聲明數組時具有比此*更高的優先級。這與數組和指針始終可以互換(它們不是)的假設相結合,可以吸引很多人。

天真的人會認爲int *arr[]是一個指向數組的指針,因爲從左到右讀這是一個自然的假設。

但它實際上是一個整數指針數組。你想要一個指向數組的指針?告訴C如下:

int (*arr)[array_size]; 

通過設置您自己的優先順序。

卡爾只解釋回答cd都適用,因爲在d情況下作爲參數傳遞你已經有一個指針的指針,並在c情況下指針數組會衰減到一個指針的指針到一個功能。

如果你想將讀取ab功能,簽名需要更改爲以下:

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

注意,在這裏上面,你需要指定數組的大小指針將指向。

一些很好的答案在二維數組和指針指針herehere

一般
0

如果傳遞數組它作爲指向數組的第一元件傳遞的函數...

  1. INT A [4] [4]至功能即樂趣(一個);它以int(* p)[4]的形式傳遞,所以fun參數必須很有趣(int(* p)[])
    這裏first元素本身是一個4整數的數組
    fun(a)---> fun(int(* p)[])

  2. int(* b)[4]是一個指向4個整數數組的指針,所以調用fun(b)require參數必須是fun(int(* pt)[ ])
    樂趣(b)--->樂趣(INT(* PT)[])

  3. INT * C [4]是4個整數指針的數組..所以調用的樂趣(c)中要求參數必須是 是po inter到數組的第一個元素。這裏第一元件是本身的int pointer..so樂趣(INT ** P)
    樂趣(c)中--->樂趣(INT ** P)

  4. INT ** d是雙指針到一個int..so調用樂趣(d)要求參數必須是 樂趣(INT ** p)
    樂趣(d)--->樂趣(INT ** p)