指標之對未宣告的位址進行訪問

2021-06-08 07:31:42 字數 1344 閱讀 9367

例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.檢查...