數組名、取數組首地址的區別


1 int a[10];
2 int *p = a;
3 int (*q)[10] = &a;

第二個為指向數組的指針.

  • a只是a[0]的地址,a+1就是a[1]的地址了,
  • &a整個a[10]的首地址,是以整個數組為角度來看,雖然它與a[0]的值相同,但是&a+1就已經增加了10個int類型的字節的長度了.

 

 1 #include <stdio.h>
 2 
 3 int a[2] = {1,2};
 4 int main(){
 5         printf("a = %p\n", a); // I
 6         printf("&a = %p\n", &a); // II
 7         printf("a + 1 = %p\n", a + 1);// III
 8         printf("&a + 1 = %p\n", &a + 1);// IV
 9 
10         return 0;
11 }

 

本機(linux)結果輸出:
a = 0x804a014
&a = 0x804a014
a + 1 = 0x804a018
&a + 1 = 0x804a01c

沒錯,上面I 和 II打印出來的地址是一樣的,IV 要比 III 大4個字節的地址空間。下面是我對這一現象的解釋,如有不妥的地方請各位大蝦一定給於指出:

  • 首先引用《C和指針》p141中的理論

在C中, 在幾乎所有使用數組的表達式中,數組名的值是個指針常量,也就是數組第一個元素的地址。 它的類型取決於數組元素的類型: 如果它們是int類型,那么數組名的類型就是“指向int的常量指針“。
看到這里我想應該就知道為什么 會有I 和 III式的結果了。

  • 對於II 和 IV 則是特殊情況,在《C和指針》p142中說到:

  在以下兩中場合下,數組名並不是用指針常量來表示,就是當數組名作為sizeof操作符和單目操作符&的操作數時

  1. sizeof返回整個數組的長度,而不是指向數組的指針的長度。 取一個數組名的地址所產生的是一個指向數組的指針,而不是一個指向某個指針常量的指針。
  2. &a后返回的指針便是指向數組的指針,跟a(一個指向a[0]的指針)在指針的類型上是有區別的。

 

參考1:http://bbs.chinaunix.net/thread-968541-1-1.html

參考2:http://blog.csdn.net/daniel_ice/article/details/6857019


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM