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=;
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指向的位址)時發生訪問衝突!
這點上與charca=」abcd」;是不同的,通過ca[x]可以修改字串中的資料.
C語言指標的初始化和賦值
1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int p 0 除外,該語句表示指標為空 此時,p只是表示定義的是個指標變數,並沒有間接取值的意思。例如 int a 25 int ptr a int b 10 int point b i...
C語言指標的初始化和賦值
1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int p 0 除外,該語句表示指標為空 此時,p只是表示定義的是個指標變數,並沒有間接取值的意思。例如 int a 25 int ptr a int b 10 int point b i...
C語言指標的初始化和賦值
1 指標的初始化 初看起來,指標的初始化和賦值好像很混亂,又是 又是 時不時又出來乙個陣列。其實總結起來很簡單 int p int a 25 int b 10 int m a int n b int r b 0 指標的定義如上所示,以 打頭的變數代表該變數為指標變數。指標初始化時,的右運算元必須為記...