數組a[]中&a和a的區別

#include<stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };
	int *ptr = (int *)(&a + 1);
	printf("%d,%d", *(a + 1), *(ptr - 1));
	return 0;
}
//輸出:2,5

前提a和&a的值是一樣的,但是意義有所區別,a指的是a[0]的地址,&a指的是數組a的地址(“數組名”代表數組第一個元素的地址,“&數組名”代表的是整個數組的地址)。從而導致a+1和&a+1有了本質的差異。

a+1 = a[0]的地址+sizeof(int);(在第一個元素的地址上便宜一個數組元素的大小,即下一個元素,a[1]的地址。)

&a+1 = 數組a的地址+sizeof(a);(在數組的地址上偏移一個數組的大小,此時sizeof(a)中的a是一個數組,不是一個指針,計算出來是一個數組的大小,不是指針的大小)

 

*(a+1):先計算a+1,a指的是a[0]的地址,a+1是a[0]的地址+size(int),就是a[1]的地址;

因此*(a+1)就是a[1]的值,a[1] = 2。

*(ptr-1):先計算ptr-1,ptr=&a+1,其中&a+1=&a+sizeof(a)(數組地址+整個數組大小);

ptr-1=&a+sizeof(a)-sizeof(int),即數組最後一個元素的地址,&a[4];*(ptr-1) = a[4] =5。

發佈了27 篇原創文章 · 獲贊 12 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章