指標代表的是記憶體單元的編號或位址,通過指標就可以找到對應的記憶體單元。對指標進行初始化或賦值的實質是將乙個位址或同型別(或相相容的型別)的指標賦給它,而不管這個位址是怎麼取得的。
1、指標的初始化
指標初始化時,「=」的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值(但是int*p=0;除外,該語句表示指標為空)。
對指標進行初始化時常用的有以下幾種方式:
1.採用null或空指標常量,如:int *p = null;或 char *p = 2-2; 或float *p = 0;
3.將乙個指標常量賦給乙個指標,如:long *p = (long *)0xfffffff0;
4.將乙個t型別陣列的名字賦給乙個相同型別的指標,如:char ary[100]; char *cp = ary;
6.將乙個字串常量賦給乙個字元指標,如:char *cp = 「abcdefg」;
ansi c定義了零指標常量的概念:乙個具有0值的整形常量表示式,或者此類表示式被強制轉換為void *型別,則稱為空指標常量,它可以用來初始化或賦給任何型別的指標。也就是說,我們可以將0、0l、'/0'、2–2、0*5以及(void *)0賦給乙個任何型別的指標,此後這個指標就成為乙個空指標,由系統保證空指標不指向任何物件或函式。
ansi c還定義了乙個巨集null,用來表示空指標常量。大多數c語言的實現中null是採用後面這種方式定義的:#define null ((void *)0)。
例如:int a = 25;
int *ptr = &a;
int b[10];
int *point = b;
int *p = &b[0];
2、指標的賦值
int *p;
int a;
int b[1];
p = &a;
p = b;
指標的賦值,「=」的左運算元可以是*p,也可以是p。
當「=」的左運算元是*p時,改變的是p所指向的位址存放的資料;
當「=」的左運算元是p時,改變的是p所指向的位址。
常見錯誤:
如果:int *p;
*p = 7;
則編譯器(vs2008)會提示the variable 'p' is being used without being initialized.即使用了未初始化的變數p。
因為p是指向7所在的位址,*p = 7給p所指向的記憶體賦值,p沒有賦值,所以p所指向的記憶體位置是隨機的,沒有初始化的。
int k;
int *p;
p = &k; //給p賦值
*p = 7; //給p所指向的記憶體賦值,即k= 7
陣列的變數名b表示該陣列的首位址,因此p=b;也是正確的
同型別的指標賦值:
C 一些技巧
一如果函式對傳入的指標引數進行修改,一定要把引數設定為指標的指標或者指標的引用 delete the first occurrence of the node which value equals item in a single linked list void delete node head,...
學習java的一些技巧!
不知不覺做軟體已經做了十年,有成功的喜悅,也有失敗的痛苦,但總不敢稱自己是高手,因為和我心目中真正的高手們比起來,還差的太遠。世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。1.紮實的基礎。資料結構 離散數學 編譯原理,這些是所有電腦科學的基礎,如果不掌握他們,很難寫出高水平的程式。據我的觀...
c 程式設計的一些技巧
第一點,使用全域性物件的建構函式在程式啟動前呼叫函式 有一些應用程式需要在主程式啟動前呼叫其它函式。如 轉態過程函式 登記 功能函式都是必須在實際程式執行前被呼叫的。最簡單的辦法是通過乙個全域性物件 的建構函式來呼叫這些函式。因為全域性物件都是在主程式開始前被構造,這些函式 都將會在main 之前返...