簡體   English   中英

將2D數組傳遞給C函數

[英]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遞增,顯示指針ap不同值。

盡管ap的實際值都是數組/第一個值位置的相同基地址(稱為X),但要注意,兩個指針的類型不同; pint*類型的,而int (*) [4]將是指向二維數組的指針的類型(因為數組衰減僅適用於第一維。在偽代碼中

p + 1 = X + sizeof(int)

a + 1 = X + sizeof(int(*)[4])= X +(sizeof(int)* 4)

其中4是數組的第二維。 因此,機器上,其中sizeof(int)是4,你會看到X + 4pX + 16a 在我的機器上, p + 1 = 0x22fe34,而a + 1 = 0x22fe40。

暫無
暫無

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

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