看下面的例子:
例十八:
char s='a';
int *ptr;
ptr=(int *)&s;
*ptr=1298;
指針ptr 是一個int *類型的指針,它指向的類型是int。它指向
的地址就是s 的首地址。在32 位程序中,s 占一個字節,int 類型占四
個字節。最后一條語句不但改變了s 所占的一個字節,還把和s 相臨的
高地址方向的三個字節也改變了。這三個字節是干什么的?只有編譯程
序知道,而寫程序的人是不太可能知道的。也許這三個字節里存儲了非
常重要的數據,也許這三個字節里正好是程序的一條代碼,而由于你對
指針的馬虎應用,這三個字節的值被改變了!這會造成崩潰性的錯誤。
讓我們再來看一例:
例十九:
char a;
int *ptr=&a;
ptr++;
*ptr=115;
該例子完全可以通過編譯,并能執行。但是看到沒有?第3 句對指
針ptr 進行自加1 運算后,ptr 指向了和整形變量a 相鄰的高地址方向
的一塊存儲區。這塊存儲區里是什么?我們不知道。有可能它是一個非
常重要的數據,甚至可能是一條代碼。而第4 句竟然往這片存儲區里寫
入一個數據!這是嚴重的錯誤。所以在使用指針時,程序員心里必須非
常清楚:我的指針究竟指向了哪里。在用指針訪問數組的時候,也要注
意不要超出數組的低端和高端界限,否則也會造成類似的錯誤。
在指針的強制類型轉換:ptr1=(TYPE *)ptr2 中,如果sizeof(ptr2
的類型)大于sizeof(ptr1 的類型),那么在使用指針ptr1 來訪問ptr2
所指向的存儲區時是安全的。如果sizeof(ptr2 的類型) 小于
sizeof(ptr1 的類型),那么在使用指針ptr1 來訪問ptr2 所指向的存
儲區時是不安全的。至于為什么,讀者結合例十八來想一想,應該會明
白的。