指標代表的是記憶體單元的編號或位址,通過指標就可以找到對應的記憶體單元。對指標進行初始化或賦值的實質是將乙個位址或同型別(或相相容的型別)的指標賦給它,而不管這個位址是怎麼取得的。
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;也是正確的
同型別的指標賦值:
int val1 = 18,val2 = 19;
int *p1,*p2;
p1 = &val1;
p2 = &val2;
初始化指標
includeusing namespace std int main nullptr 是 c 新標準引入的特性,visual c 2010 編譯器支援它。過去已經使用0或 null 編譯器將用 0代替此巨集 來初始化指標,當然它們現在仍然可以使用。但是,使用 nullptr 初始化指標要好得多。因...
指標的初始化
下面的函式有什麼錯誤 int square volatile int ptr 這段 的目的是用來返指標 ptr指向值的平方,但是,由 於 ptr指向乙個volatile型引數,編譯器將產生類似下面的 int square volatile int ptr 由於 ptr的值可能被意想不到地該變,因此a...
指標的初始化
1.字元指標的初始化 在c語言中 string 儲存的就是首個字元所在的位址 所以可以把 字串常量 string 賦值給指標 char p p string 但不能把字串常量直接賦給陣列,需要用到 strcpy。但可以對陣列初始化為字串,也就是字元陣列。如 char str string 兩種初始化...