思考
#includeint main()
; 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,這樣表示讓位址按整形去計算。
聯想
#includeint main()
; int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x, %x\n", ptr1[-1], *ptr2);
return 0;
}
大家能想到這樣結果是多少麼 關於強制型別轉換
var dump 0 null false var dump 0 0 true var dump 0 false var dump 0 false true var dump 0 null true var dump 0 0 true var dump 0 true var dump 0 false...
強制型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...
強制型別轉換
顯式轉換也稱為強制型別轉換 cast 包括以下列名字命名的強制型別轉換操作符 static cast dynamic cast const cast 和 reinterpret cast。命名的強制型別轉換符號的一般形式如下 cast name expression 其中 cast name 為 s...