首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言陣列名 a 與 &a 的本質區別:型別與指標運算

     編輯:關於C語言

核心結論

a 與 &a 數值相同(首地址),但型別不同,導致指標運算語意截然不同。

型別對照

表達式型別意義
aint*指向首元素的指標
&aint(*)[5]指向整個陣列的指標

指標運算實測

int a[5] = {0,1,2,3,4};
int *p1 = a;      // int*
int *p2 = &a;     // 警告:型別不匹配,但值相同

printf("%p\n", a);     // 0022FF20
printf("%p\n", a+1);   // 0022FF24  (+1 * sizeof(int) = +4)
printf("%p\n", &a+1);  // 0022FF34  (+1 * sizeof(int[5]) = +20)

記憶體佈局圖解

a (int*)     → [0][1][2][3][4]  每格 4 bytes
&a (int(*)[5]) → [0][1][2][3][4] 整體 20 bytes

a+1  移動 1 個 int   → 指向 a[1]
&a+1 移動 1 個陣列 → 指向陣列結尾後(越界)

實務意義

  • 函式參數:void foo(int *p) 接收 a;void bar(int (*p)[5]) 接收 &a
  • 多維陣列:int a[3][4],a 型別為 int(*)[4],&a 為 int(*)[3][4]
  • sizeof:sizeof(a) = 20,sizeof(&a) = 指標大小(4/8)

常見錯誤

int (*p)[5] = &a;  // 正確
int *p = &a;       // 編譯警告,雖然能跑但語意錯誤
p = a;             // 正確
p = &a;            // 錯誤:不能將 int(*)[5] 指派給 int*

作者:雷格碼

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved