例1、
下列**的執行結果是什麼?
int *ptr;
ptr=(int *)0x8000;
*ptr=3;
把這個位址0x8000給指標ptr ,但是這個位址不一定是空閒位址,有可能被其他的地方占用。這樣就又可以導致訪問錯誤。
總之 ,不能隨意的給指標指定乙個位址。
例2、下面這個程式在哪一行會崩潰?
struct s
int i;
int *p;
int main()
s s;
int *p=&s.i;
p[0]=4;
p[1]=3;
s.p=p;
s.p[1]=1;
s.p[0]=2;
return 0;
解析:首先&s.i的位址賦給p,即p指向了i的位址,所以p[0]即為i,p[1]即為s中p指向的位址,即p[1]為*(p+1),p又為
i的位址,所以i的位址加乙個int就是p的位址,即&p,再解引用*(&p)即為p此時指向的位址。
所以p的值為0x00000003,
然後s.p=p;
因為p還是存放著i的位址,此時賦值,即s.p=&s.i;即s中的p指向了s中的i的位址。
s.p[1]=1;
等價於*(&s.i+1)即i的位址加上乙個int,即為p的位址&p,然後解引用即為p指向的位址,所以這句意思即為,為s中的p指向的位址賦值為1,所以s中p的值為0x00000001,此時s中的p就不再指向s中的i的位址了。
最後:s.p[0]=2;
即為*(s.p),即為s中的*p賦值,意思就是在記憶體0x00000001的上面賦值為2,這樣對於乙個未作宣告的位址直接進行訪問,所以出錯,即是在s.p[0]=2;這句中崩潰的。
如果將最後兩句調換則最終是正確的,即
s.p[0]=2;
s.p[1]=1;
這樣是意思是一開始s中的p還是指向s中的i的位址的,s.p[0]=2;這句的意思就是為s中的i賦值為2,因為此時p還是指向i的位址的。
s.p[1]=1;
這句即為*(&s.i+1)即為p指向的位址,將p指向的位址賦值為1,即p指向的位址為0x00000001;所以最後就不會出錯。
總結:int *p = (int*)0x0018ff5c;
*p = 3;
std::cout<<*p《在我機器上輸出了3,說明這塊記憶體是可以訪問的,但是這塊記憶體位址是不一定的,有的電腦上就有可能被占用。不過還有一種方式:
int i;
int m=(int)&i;
int *ptr;
ptr=(int *)m;
*ptr=3;
這樣就是為乙個指定的記憶體位址賦值。
C 指標之對未宣告的位址進行訪問
例1 下列 的執行結果是什麼?int ptr ptr int 0x8000 ptr 3 例2 下面這個程式在哪一行會崩潰?struct s int i int p int main s s int p s.i p 0 4 p 1 3 s.p p s.p 1 1 s.p 0 2 return 0 解析...
WINCE 對實體地址的訪問
wince程式設計 對實體地址的訪問 1 io介面是xscale處理器的外部裝置,對於一般的微控制器,可以直接操作硬體,即通過直接讀寫io埠來訪問硬體.而對於wicne作業系統,它遮蔽了使用者應用程式對硬體訪問的許可權,只有核心應用程式才可以訪問硬體資源.如果要直接訪問某一址的物理記憶體 對於arm...
MySql通過ip位址進行訪問的方法
1.登入mysql mysql u root h 127.0.0.1 p 2.切換資料庫 use mysql 3.授權 grant all privileges on to root 127.0.0.1 identified by 密碼 程式設計客棧 將127.0.0.1換成公網的ip位址。4.檢查...