C指針的初始化與賦值

1、指針的初始化

初看起來,指針的初始化和賦值好像很混亂,又是*,又是&,時不時又出來一個數組。其實總結起來很簡單:

int *p;

int a=25;

int b[10];

int *m=&a;

int *n=b;

int *r=&b[0];

指針的定義如上所示,以*打頭的變量代表該變量爲指針變量。

指針初始化時,“=”的右操作數必須爲內存中數據的地址,不可以是變量,也不可以直接用整型地址值(但是int *p=0;除外,該語句表示指針爲空)。此時,*p只是表示定義的是個指針變量,並沒有間接取值的意思。

Int *s=15;

Int *s={2,3,5};

Int *s=a;

以上這三種初始化方式都是錯誤的。

2、指針的賦值

P=m;

P=&a;

P=b;

*p=25;

*p=a;

*p=b[4];

指針的賦值,“=”的左操作數可以是*p,也可以是p

當“=”的左操作數是*p時,改變的是p所指向的地址存放的數據;當“=”的左操作數是p時,改變的是p所指向的地址

數組的變量名b表示該數組的首地址,因此p=b;也是正確的。

3、   “特殊情況”

前面講到了,指針的初始化必須使用變量地址,而不可以直接使用變量。

那麼,下面這個又如何解釋呢:

Char *cp=”abcd”;

其實,這個初始化過程,是將指針cp指向字符串的首地址,而並不是傳遞字符串的值。因爲,在C語言裏面,沒有整體處理一個字符串的機制。

所以,我們的標題“特殊情況”加上了一個引號,因爲,它實際上也是以變量地址初始化的指針,“特殊情況”並不特殊。

由此引出,如何使用字符串對指針賦值呢?只有採用下面這種方式:

Cp=”mnop”;

型如*cp=”mnop”;這樣的語句是錯誤的。原因如上所述,字符串常量傳遞的是它的首地址。

另外,這個初始化過程還有另一層隱含的意思:”abcd”是字符串常量,在初始化過程中並沒有發生字符串的複製,而只是簡單的將指針指向該字符串常量,因此,不可以通過*cp修改該字符串的值,因爲該字符串爲常量。當然,我們可以使用“cp=”來修改指針指向的字符串,指針本身並不是常量。

如果試圖通過指針*cp來修改該字符串,會出現什麼結果,答案是未定義的,要視不同的編譯器而定。至少有一點可以確定,在編譯階段,編譯器不會報錯,因爲*cp不是常量,所以對*cp賦值並沒有什麼語法錯誤。但是有些編譯器,比如VC,會在運行時拋出異常:寫入位置 0x00415768(cp指向的地址) 時發生訪問衝突!(PS:這也是我的小程序遇到的問題,最後還是在方磊同學的啓發下找出了正確答案。這次經歷告訴我,不要固守已見,以爲自己頭腦中的一定是對的。或許翻翻參考書,問題就會迎刃而解!)

這點上與char ca[]=”abcd”;是不同的,通過ca[x]可以修改字符串中的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章