1. 程式人生 > 其它 >C++初識指標之一

C++初識指標之一

新手學習C/C++都跳不過去的地方,就是指標,用的話,確實好用,但是概念比較繞,

指標的通俗說法

1.簡單的來說,就是說每一個變數,在電腦內都佔一個地方,這個地方用一個16進掉的編號來進行標記,類似於,一個人有身份證,那要找你的時候,可以能過身份證來查詢你的資訊.指標,就是用來指向這個編號的.

2.這個地址是本身是常量,是改不了的,記住這一點,但是可以讓指標,指向其他地址,這個是可以的,

比如你本人有一個身份證,你記住了號碼,這時你的朋友他也有一張身份證,你也可以記住他的身份證號,但是此時,你的身份證不會因此改變.

3.宣告指標 型別 * 變數名

宣告一個指標,用來存放變數的地址,此時,這個指標就會指向這個變數的地址,那麼,如果此時操作指標,就相當於在修改這個變數.

例如:

可以看到,在=號的右邊時我們用指標,將a的值賦給了變數b.

如果直接輸出p,我們得到了a的地址.

如果我們輸入*p,即得到a的值

---->>>其中,指標的型別和要指向的變數地址的變數本身的型別要一致,不能說是字元型的指標,來指向一個整型的變數,這樣是不可以的.<<<------重點!!!

變數的地址用&來表示取地址.那麼此時,整型指標p,就指向了整變數a的地址.如果此時輸出p就可以得到a的地址,如果想返回a的值,那麼需要在p前加一個*號即可.

此處的*號和宣告這裡的*號是含意不同的.在=號運算子的右邊或者輸出的時候,此時叫解運算,即得到指標所指向的變數本身.

比如本例中, int* p= &a;在=號左邊時,稱為左值,為左值時,此時是用來宣告這個聲針,如果為右值或者輸出的時候,表示是取a的值.

插播一下:在C/C++中,如果用const關鍵字來宣告一個常量,用指標是可以進行修改的,所以最好用巨集定義來宣告一個常量,用全大寫來命名;

再插一下:常量,即不會改變的量,比如.圓周率,常記為:3.1415926,又比如一天有24個小時,白天12小時,晚上12小時,1小時60分鐘,1分鐘60秒,一週有7天,這些是不會改變的,即常量

    常量的宣告方式為:#define HOUR

======================================================================================================

重點來了,無情分割線

======================================================================================================

當宣告的指標型別為字元的時候,那麼這個指標可以接收字串,即可以看作以下的形式:

//宣告一個字元陣列

char chr_a[128]="hello";此時等價於 char* str="hello";

但是,要注意的是,最好不要直接給指標賦值,如上面這面 char* str="hello";這樣是很安全的,因為hello此時是一個隨機的地址,這個地址有可能會有變化,這是很危險的

程式設計還是要養成好習慣,把可能發成的錯誤消滅掉,那麼上面的宣告方式可以修改為這樣:

char str_a[]="hello";

char* str1= str_a;

這樣就是安全的方式了.

此時指標的地址,實際為str_a[0],也就是字元陣列的第0個元素.char str_a[]="hello";可以看作是char str_a[]={"h","e","l","l","o"};

對陣列的元素操作的時候,以下這樣的操作是相同的

for (int i =0;i<5;++i)

{

   cout << *(str1+i) << endl;

   cout << str_a[i] << endl;

}

4.空指標

當聲明瞭一個指標,但是沒有具體的地址指定給它的時候,可以置空或者是0.

例如:char* p = NULL;

  char* p2= 0;

這兩種都是可以的,但是此時p和p2是不可以傳值的,雖然語法上是沒有問題,但是不會輸出任何的結果.如下:

但是,可以把地址傳給空指標.此時空指標只指向了被傳地址的首地址,如上面的例子中str1指向的首地址是字母h的地址,也就是字元陣列的首元素,str_a[0].

此時取str2和str3,會得到如下

關於空指標先寫到這裡,還有一些我還未理解透徹,寫本文算是做一個筆記,把自己理解的東西記錄下來.