關於強制型別轉換
阿新 • • 發佈:2018-12-10
思考
#include<stdio.h>
int main()
{
int a[4] = {1, 2, 3, 4};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x, %x\n", ptr1[-1], *ptr2);
return 0;
}
輸出:4,2000000
我們先看第一個我們知道ptr1[n] = *(ptr1 + n)所以ptr1[-1]實際上就說ptr所指的前一個元素,除此之外我們還要注意int *ptr1=(int *)(&a+1);中的&a是取a的引用,他的值和a相同(本人親測),但是引用相當於取整體,所以+1相當於+4,所以指標ptr所指的前一個元素為4.
第二個
將a轉為int型別(同char *)注:除了指標型別只能用轉int,因為指標固定的,必須轉int(4位元組),強制型別轉換不能對記憶體地址操作,所以只可以用int,這樣表示讓地址按整形去計算。
聯想
#include<stdio.h> int main() { char a[5] = {1, 1, 1, 1,0}; int *ptr1=(int *)(&a+1); int *ptr2=(int *)((int)a+1); printf("%x, %x\n", ptr1[-1], *ptr2); return 0; }
大家能想到這樣結果是多少麼