1. 程式人生 > 其它 >指標地址的強制轉換(二)

指標地址的強制轉換(二)

技術標籤:C語言c語言

0x01:程式碼

intmain()
{
	int a[4]={1,2,3,4};
	int *ptr1=(int *)(&a+1);
	int *ptr2=(int *)((int)a+1);
	printf("%x,%x",ptr1[-1],*ptr2);
	return 0;
}

這個題目百度問答裡邊有回覆的,但是存在問題,我們一起康康;

0x02:程式碼分析
ptr1: 將&a+1 的值強制轉換成int型別,賦值給int 型別的變數ptr,ptr1 肯定指到陣列a 的下一個int 型別資料了。ptr1[-1]被解析成*(ptr1-1),即ptr1 往後退4 個byte。所以其值為0x4;

ptr2:a可以表示int型陣列首元素首地址,但是這裡使用(int)a做了強制型別轉換,陣列的型別為int型,所以(int)a+1 的值是 &a+sizeof(int)0x01。然後把這個地址強制轉換成int型別的值賦給ptr2,也就是說*ptr2 的值應該為&a+sizeof(int)*0x01的值,我們可以通過VS檢視記憶體佈局;
在這裡插入圖片描述
在這裡插入圖片描述
由記憶體中資料可知當前資料的儲存方式為大端模式,sizeof(int)=4,每個元素在記憶體中佔4位元組,通過上邊分析應該可以知道答案了,ptr1[-1] = *(ptr1-1) =0x4,*ptr2 = 2000000;

在這裡插入圖片描述
這樣看可能還是不夠明顯,看下面例子;

定義陣列a[]:
在這裡插入圖片描述
變數的值:
在這裡插入圖片描述
記憶體中的值:
在這裡插入圖片描述
輸出資訊:
在這裡插入圖片描述