[英]Passing a 2D Array into Function in C
這是我的代碼:
void display(int *p)
{
printf ("%u\n", p);
printf ("%u\n", p+1);
}
int main()
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,0,1,2
};
printf("%u\n",a);
printf("%u\n",a+1);
display(a);
}
為什么a + 1和p + 1給出不同的地址? 如果a和p給出相同的地址,那么a + 1和p + 1不應該指向相同的地址嗎?
你的編譯器應該扔了一個錯誤(或至少是一個警告)當你路過a
是類型的int (*)[4]
於預期的函數int *
。 如果打開所有編譯器警告,則會看到此信息。
我的編譯器明確指出:
警告:從不兼容的指針類型傳遞“顯示”的參數1
忠告:當您的編譯器抱怨您的代碼時,您最好注意一下。 學會使用所有編譯器標志( -Wall -pedantic
等)-這將在根深蒂固之前抓住大多數不良的編碼習慣。 或有一天他們會咬你。
它們的大小不同,因此移至下一個會增加不同的數量。 如果您使用int
指針和char
指針,將會發生相同的事情-由於它們的大小不同,因此將一個地址添加到同一地址將為您提供不同的地址。
為了編譯代碼,您必須將最后一條語句更改為display(&a[0][0])
。 原因是數組衰減沒有被重復應用,因此int[3][4]
成為int(*)[4]
。 使代碼可編譯后,您將看到所遇到的問題:以1遞增,顯示指針a
和p
不同值。
盡管a
和p
的實際值都是數組/第一個值位置的相同基地址(稱為X),但要注意,兩個指針的類型不同; p
是int*
類型的,而int (*) [4]
將是指向二維數組的指針的類型(因為數組衰減僅適用於第一維。在偽代碼中
p + 1 = X + sizeof(int)
a + 1 = X + sizeof(int(*)[4])= X +(sizeof(int)* 4)
其中4是數組的第二維。 因此,機器上,其中sizeof(int)
是4,你會看到X + 4
為p
和X + 16
為a
。 在我的機器上, p + 1
= 0x22fe34,而a + 1
= 0x22fe40。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.