天天看點

指針、指針變量與記憶體空間——解惑

指針、指針變量與記憶體空間——解惑

       一年前,我曾今在chinaunix寫過一篇部落格《關于定義一個指針與指針變量》然後搬家來了csdn。這篇部落格中寫道了很多關于指針和指針變量以及空間配置設定的一些常見錯誤。但是,到現在為止,無論是csdn的網友還是一些已經工作的同僚以及大三大四的學生,陸陸續續的有人在問我關于指針與指針變量還有空間配置設定問題。我想在這裡再寫一篇部落格解惑指針

問題1

int idata = 5;

int *p = idata//為什麼這裡不對?

既然通常*p表示對指針p指向資料的引用,為什麼*p = idata不能行呢?

回答:int *p和引用時的*p概念是不一樣的。定義資料的時候 int *p所表示的是定義了一個指向int資料的指針p。并不是資料引用時的*p.

是以,int *p隻是定義了一個指向int資料的指針p,這個指針p所存放的是一個位址(32位),而idata是一個int資料,int資料不能指派給一個位址。除了定義以外的其他地方,*p所表示就是p所指向的資料。

是以以上語句作出以下更改就對了:

int *p = &idata;//p存放idata的位址

問題2:

既然問題1中已經說了,定義是隻是定義了一個指針p,下面的語句為什麼是對的呢?

char *p = "hello world";//為什麼是對的?

回答:

c語言中,字元字元串常量是按字元串數組來處理的,會在記憶體中開辟一個字元串數組用來存放該字元串常量,然後把該字元串數字的首元素位址指派給p。

以上語句其實等價于下面:

char *p = "hello world";

//等價于

char tmp[] = "hello world";

char *p = tmp;

char *p = null;//初始化,避免編譯錯誤

p = tmp;

問題3:

對于結構體指針,struct mystruct *pstruct,然後對pstruct進行操作,為什麼有時候正确,有時候又報記憶體錯誤?

指針的操作分為輸入與輸出。所謂輸入:即将指向結構體的指針pstruct穿進去給别人處理。輸出:即别的函數需要輸出,需要寫的。

你所謂的有時候正确有時候又不正确,其實是因為你沒有搞清楚究竟該誰配置設定空間。一定要銘記:定義一個指針隻是定義了一個存放位址的指針變量,他隻能存放位址,定義一個指針并沒有為他所指向的資料配置設定空間。例如 struct mystruct *p,定義了一個指向struct mystruct的指針變量p,并沒有配置設定struct mystruct大小的資料空間。如果p沒有指向任何資料,你對它進行寫操作,必定會出記憶體錯誤。

但是如果這樣做:

struct mystruct myst;

struct mystruct *p = &myst;

然後再對p進行操作,就不會出錯。說到底,還是沒有弄清楚程式設計需要誰去為資料配置設定空間的問題。

最近在溫故《c ++ primer》這本書,其中有一句話非常經典:

when attempting to understand pointer declarations, read them

from right to left.

了解指針定義的時候,應該從右往左讀

版權申明:

轉載文章請注明原文出處http://blog.csdn.net/feiyinzilgd/archive/2011/01/05/6119090.aspx

并請聯系譚海燕本人或者前往譚海燕個人首頁留言

繼續閱讀