當我們定義一個數組a時,編譯器根據指定的元素個數和元素的類型分配確定大小(元素類型大小*元素個數)的一塊內存,並把這塊內存的名字命名為a。名字a一旦與這塊內存匹配就不能改變。a[0],a[1]等為a的元素,但並非元素的名字。數組的每一個元素都是沒有名字的。
這里&a[0]和&a到底有什么區別呢?a[0]是一個元素,a是整個數組,雖然&a[0]與&a的值一樣,但其意義不一樣。前者是數組元素的首地址,而后者是數組的首地址。以指針的形式訪問和以下標的形式訪問時,記住偏移量的單位是元素的個數而不是byte數,在計算新地址時千萬別弄錯了。
通過下面的例子來看:
#include<iostream>
using namespace std;
int main()
{
int a[5]={1,2,3,4,5};
int* ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
system("pause");
return 0;
}
答案:2,5
解析:
int* ptr=(int*)(&a+1);&a為數組a的首地址,對指針加1操作,得到的是下一個元素的地址,而不是原有地址值直接加1,所以&a+1則為&a的首地址加5*sizeof(int),顯然當前指針已經超過了數組的界限。將上一步計算出來的地址,強制轉換成int*類型,賦給ptr。
*(a+1);a,&a的值是一樣的,但意思不一樣。a是數組首元素的首地址,也就是[0]的首地址,a+1是數組下一個元素的首地址,即a[1],&a+1是下一個數組的首地址。所以輸出2
*(ptr-1);因為ptr是指向a[5],並且ptr是int*類型,所以*(ptr-1)是指向a[4],輸出5。