指針學習筆記

   要搞清楚指針,先要清楚幾個概念,指針的類型,指針所指向的類型,指針的值,指針本身所佔的內存區

   直接看幾個例子吧

   (1)int*ptr;//指針的類型是int*

(2)char*ptr;//指針的類型是char*

(3)int**ptr;//指針的類型是int**

(4)int(*ptr)[3];//指針的類型是int(*)[3]

(5)int*(*ptr)[4];//指針的類型是int*(*)[4]

指針所指向的類型

(1)int*ptr; //指針所指向的類型是int

(2)char*ptr; //指針所指向的的類型是char

(3)int**ptr; //指針所指向的的類型是int*

(4)int(*ptr)[3]; //指針所指向的的類型是int()[3]

(5)int*(*ptr)[4]; //指針所指向的的類型是int*()[4]

 

指針的類型和指針所指向的類型是兩個概念,正確區分這兩個概念是精通指針的關鍵之一。

 

指針的值是指指針本身存儲的數值,這個值將被編譯器當做一個地址,指針在32位電腦上是4個字節也就是32個位。指針的值是很重要的,當你定義一個指針之後你要問自己你所定義的指針是指向哪裏的,如果還未初始化,也就是說指針所指向的內存區是不存在的毫無意義的。

  

指針的算術運算。

指針的加減運算與通常的數值加減運算是不一樣的,是以單元爲單位的。

如以下代碼:

char a[13]="Hello World!";

int *ptr=(int *)a;

ptr++;

cout<<*ptr<<endl;

可以看到屏幕上輸出的是1867980911,但是不要緊,些如下代碼:

char b=(char)1867980911;

cout<<b<<endl;

在屏幕上得到的值是小寫的字母o,所以分析以上代碼,由於指針一次移動是int也就是4個字節,而在vcchar是佔一個字節的,所以纔會出現ptr移到o去了。

運算符&*,這個我想一般的課本上面也應該有講,&就是去地址運算符,*是間接運算符,例子如下:

int a=12;

int *p=&a;

int **ptr;

ptr=&p;

cout<<&a<<endl;

cout<<p<<endl;

cout<<*ptr<<endl;

cout<<ptr<<endl;

cout<<&p<<endl;

cout<<a<<endl;

cout<<*p<<endl;

cout<<**ptr<<endl;

請讀者自己將上面代碼敲出來,並且仔細琢磨輸出的值爲什麼會是那麼多,我先在此分析一下。

第一行定義一個一個整數a,第二行定義一個指向a的整形指針p,第三行定義了一個二級指針,第四行將p的地址賦給了二級指針ptr

第五行對a去地址並輸出,第六行輸出p裏面所存的地址,第七行是輸出p的值,所以這3行輸出的結果是一樣的,都是a的地址。

第八行的ptr代表的是p的地址,第九行對p取地址然後輸出,所以這兩行的值也是一樣的。

第十,十一,十二行輸出的結果都是a的值,也就是12

 

數組和指針的關係,其實一句話就可以概括,數組名即使指針,如下int a[10],數組名a就是一個地址,指向數組第一個位置的地址,

 

指針與函數的關係,仔細分析下面這個函數就行了,下面的這個程序中a=(*pfun)(str);就是根據函數指針來調用函數的。

int fun(char *s)

{

   int num=0;

  

   while(*s!=0)

   {

      num+=*s;s++;

   }

   return num;

}

int a;

   int (*pfun)(char *);

   pfun=fun;

   char str[]="abcdefghijklmn";

   a=(*pfun)(str);

   cout<<a<<endl;

如果讀者仔細看了以上內容的話指針這塊應該問題不大了,請讀者一定要親自敲代碼,實踐出真理,要自己體會,否則要想弄清指針還是有困難的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章