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指向的地址) 時發生訪問衝突!

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

4、   C語言的經典著作

最後,順便提一下C語言的經典好書。主要有下面幾本:

The C Programming Language》(C程序設計語言),C語言之父所著,短短二百多頁就可以把C語言的各種細節描繪得清清楚楚,不可不謂經典。比起國內四五百頁,卻不知其所云的C語言程序設計來,真是天壤之別。

C專家編程》,該書第一版於2002年由人民郵電出版社引進,之後曾一度絕版。最近傳出要再版的消息,令人不能不興奮。同時,這本書也是我近期想要收藏的。

                                                                                      

另外,還有兩本著作不可不提:《C和指針》、《C陷阱與缺陷》。這兩本書也是絕版多年,而且書中很多內容是針對於未標準化前的C提出的。如果能找來電子書的話,作爲參考也是不錯的。

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