C語言中 陣列名 與 ”&陣列名” 的區別
(1) 測試程式碼 :
#include<stdio.h> int main() { int a[5] = {1,2,3,4,5}; printf("a = %p\n",a); // 陣列名代表首地址 . 000000000064FE30 printf("&a = %p\n",&a); // "&a"代表陣列的地址 . 000000000064FE30 printf("a+1 = %p\n",a+1); // 陣列名代表首地址 . 000000000064FE34 printf("&a+1 = %p\n",&a+1); // "&a"代表陣列的地址 return 0; } |
分析 :
* a是陣列名, 代表陣列的首地址, a+1就是陣列的下一個元素的地址(也就是第二個元素的地址) .
* "000000000064FE34" - "000000000064FE30" = 4(轉換為十進位制也是4)
(因為int型的陣列一個變數佔4個位元組) .
* "000000000064FE30" - "000000000064FE44" = 14
(轉換為十進位制是20), (因為int型陣列中有 5 個元素, 一個元素佔 4 個位元組) .
* 說明:
(1) 陣列名 + 1 = 第二個元素 .
(2) &陣列名 + 1 = 整個陣列的下一個地址 .
* "&陣列名" + 1 :
* "陣列名" + 1 : 一次移動一個元素 .
(2) 面試題 :
#include<stdio.h> int main() { int b[5] = {1,2,3,4,5}; int *ptr1 = (int*)(&b + 1); int *ptr2 = (int*)(b + 1); printf("%x\n",ptr1[-1]); // 輸出 5 printf("%x\n",*ptr2); // 輸出 2 return 0; } |
分析 :
* 可以把ptr1[-1]看成: *(ptr1 - 1), 因為這時候* ptr2最終指向的是陣列的第二個元素的地址 .
(3)誤區分析:
#include<stdio.h> int main() { int ch[5] = {1,2,3,4,5}; int (*ptr1)[5] = &ch; // 第二行 . int (*ptr2)[5] = ch; // 第三行(報錯行) . return 0; } |
分析 :
* 整個程式會在第三行出報錯, 因為前後的型別並不匹配 .
* &ch: 代表整個陣列的地址, 所以左右型別一致.
* ch : 只代表陣列第一個元素的地址, 所以左右型別不一致 .