不理解指標,是因為有人教錯了你。
有人告訴你,指標是“指向”某某某的,那就是誤導你,給你挖了個坑。初學者小心不要誤讀這“指向”二字。
第一,“指標”通常用於儲存一個地址,這個地址的資料型別在定義指標變數時確定。
舉個例子,做個比較:
int a; //定義一個變數a,用於儲存一個int型別。
int * b; //定義一個指標變數b,用於儲存一個地址,這個地址所儲存的資料應該是int型別。
第二,是變數就應該可以賦值,指標變數也一樣。但一般不會給指標直接賦值一個數值,而是將其他變數的地址賦值給指標,或者其他指標的值賦值給這個指標。
繼續上面的例子:
b=&a; //把變數a的地址賦值給b。“&”操作是取變數的地址。
繼續舉例:
int * c; //我們又定義一個指標c
c=b; //將b的值賦值給c,上面已經知道b是指標,它的值是a的地址,那麼現在c 的值和b一樣,也是個a的地址。
第三,指標變數儲存的值,也就是地址是可以變的。
舉個數組初始化的例子:
int d[100];
int * e;
e=&d[0]; //e儲存了陣列d的第一個資料的地址
for (int i=0; i<100; i++){
*e = 0; //把該地址中的資料賦值0
e++; //地址累加一次,也就是陣列中下一個資料的地址
}
指標和其他變數一樣,可以運算(一般是加減),也可以重新賦值。
第四,指標有啥用。
比方說,我們有個函式,如下:
int add(int x){
return (x+1); //把輸入的值加1並返回結果。
好了,應用的時候是這樣的:
{
int a=1;
a=add(a); //add函式返回的是a+1
//現在 a等於2
很簡單吧,就是把a都累加一次。
用指標怎麼寫:
void add(int *y){ //給入的是一個int指標,是一個地址。
*y = *y + 1; //* 是指引用 這個地址所儲存的變數
//這條語句的意思就是,把這個地址裡的值加1,然後放回這個地址。
把這個函式用起來:
add(&a); //把a的地址傳到函數里
//add函式,就是把a的值加1,再放回到變數a裡。
//現在a等於2
試想一下,如果我們要對一個數據結構裡的資料進行處理,那是不是就該傳入這個結構的地址,在函式中依靠指標來引用這個地址的資料結構,進行運算。
第五,若已有一個指標變數,可不可以用另外一個指標來儲存這個變數的地址呢。
可以的。
一個變數儲存另一個指標的地址,那它就是通常所說是“指標的指標”了。
通常,指標的指標多用做(或指的是)函式指標或資料結構中有指標的情況。初學者搞不清,就不要勉強了。
第六,空指標可怕嗎?
我們知道,一個變數要賦值後才能用,指標也是一樣。指標不賦值(不給定地址)就拿來用,是不是也要出錯。這個就是空指標。一般把指標賦值為Null,就是表明這個指標是空的,不能用。所以程式中一定要經常判別指標不是Null才能用。
最後,初學C語言,最好把複合的語句拆開來看,比較容易理解。像 int *a=&b; 這種,拆成
int * a;
a=&b;
就好理解了。
不理解指標,是因為有人教錯了你。
有人告訴你,指標是“指向”某某某的,那就是誤導你,給你挖了個坑。初學者小心不要誤讀這“指向”二字。
第一,“指標”通常用於儲存一個地址,這個地址的資料型別在定義指標變數時確定。
舉個例子,做個比較:
int a; //定義一個變數a,用於儲存一個int型別。
int * b; //定義一個指標變數b,用於儲存一個地址,這個地址所儲存的資料應該是int型別。
第二,是變數就應該可以賦值,指標變數也一樣。但一般不會給指標直接賦值一個數值,而是將其他變數的地址賦值給指標,或者其他指標的值賦值給這個指標。
繼續上面的例子:
b=&a; //把變數a的地址賦值給b。“&”操作是取變數的地址。
繼續舉例:
int * c; //我們又定義一個指標c
c=b; //將b的值賦值給c,上面已經知道b是指標,它的值是a的地址,那麼現在c 的值和b一樣,也是個a的地址。
第三,指標變數儲存的值,也就是地址是可以變的。
舉個數組初始化的例子:
int d[100];
int * e;
e=&d[0]; //e儲存了陣列d的第一個資料的地址
for (int i=0; i<100; i++){
*e = 0; //把該地址中的資料賦值0
e++; //地址累加一次,也就是陣列中下一個資料的地址
}
指標和其他變數一樣,可以運算(一般是加減),也可以重新賦值。
第四,指標有啥用。
比方說,我們有個函式,如下:
int add(int x){
return (x+1); //把輸入的值加1並返回結果。
}
好了,應用的時候是這樣的:
{
int a=1;
a=add(a); //add函式返回的是a+1
//現在 a等於2
}
很簡單吧,就是把a都累加一次。
用指標怎麼寫:
void add(int *y){ //給入的是一個int指標,是一個地址。
*y = *y + 1; //* 是指引用 這個地址所儲存的變數
//這條語句的意思就是,把這個地址裡的值加1,然後放回這個地址。
}
把這個函式用起來:
{
int a=1;
add(&a); //把a的地址傳到函數里
//add函式,就是把a的值加1,再放回到變數a裡。
//現在a等於2
}
試想一下,如果我們要對一個數據結構裡的資料進行處理,那是不是就該傳入這個結構的地址,在函式中依靠指標來引用這個地址的資料結構,進行運算。
第五,若已有一個指標變數,可不可以用另外一個指標來儲存這個變數的地址呢。
可以的。
一個變數儲存另一個指標的地址,那它就是通常所說是“指標的指標”了。
通常,指標的指標多用做(或指的是)函式指標或資料結構中有指標的情況。初學者搞不清,就不要勉強了。
第六,空指標可怕嗎?
我們知道,一個變數要賦值後才能用,指標也是一樣。指標不賦值(不給定地址)就拿來用,是不是也要出錯。這個就是空指標。一般把指標賦值為Null,就是表明這個指標是空的,不能用。所以程式中一定要經常判別指標不是Null才能用。
最後,初學C語言,最好把複合的語句拆開來看,比較容易理解。像 int *a=&b; 這種,拆成
int * a;
a=&b;
就好理解了。