指針

#include<stdio.h>
int main(void)
{
 int a=3,*p;
 p=&a;
 printf("a=%d,*p=%d\n",a,*p);
 *p=10;
 printf("a=%d,*p=%d\n",a,*p);
 printf("Enter a:");
 scanf("%d",&a);
 printf("a=%d,*p=%d\n",a,*p);
 (*p)++;
 printf("a=%d,*p=%d\n",a,*p);
 
 return 0;
}



                        指針的學習與體會
      在計算機中,所有的數據都是存放在內存中的,一般把內存中的一個字節稱爲一個內存單元,不同的數據類型所佔用的內存單元數不一樣,如int佔用4個字節,char佔用1個字節。爲了正確地訪問這些內存單元,必須爲每個內存單元編上號。每個內存單元的編號是唯一的,根據編號可以準確地找到該內存單元。內存單元的編號叫做地址(Address),也稱爲指針(Pointer)。

 1.指針類型分析 
分析指針,可以從變量名處起,根據運算符優先級結合,一步一步分析. 
int p;  //這是一個普通的整型變量 
int *p;  //首先從P處開始,先與*結合,所以說明P是一個指針,然後再與int結合,說明指針所指向的內容的類型爲int 型.所以 P是一個返回整型數據的指針 
int p[3];  //首先從P處開始,先與[]結合,說明P 是一個數組,然後與int結合,說明數組裏的元素是整型的,所以 P是一個由整型數據組成的數組 
int *p[3];  //首先從P處開始,先與[]結合,因爲其優先級比*高,所以P是一個數組,然後再與*結合,說明數組裏的元素是指針類型,然後再與 int結合,說明指針所指向的內容的類型是整型的,所以是一個由返回整型數據的指針所組成的數組 
int (*p)[3];  //首先從P處開始,先與*結合,說明P是一個指針然後再與[]結合(與"()"這步可以忽略,只是爲了改變優先級),說明指針所指向的內容是一個數組,然後再與int 結合,說明數組裏的元素是整型的.所以P是一個指向由整型數據組成的數組的指針 

2.指針分析 
指針是一個特殊的變量,它裏面存儲的數值被解釋成爲內存裏的一個地址。 
要搞清一個指針需要搞清指針的四方面的內容:指針的類型、指針所指向的類型、指針的值或者叫指針所指向的內存區、指針本身所佔據的內存區。 
指針的類型:把指針聲明語句裏的指針名字去掉,剩下的部分就是這個指針的類型 
指針所指向的類型:把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針所指向的類型(在指針的算術運算中,指針所指向的類型有很大的作用) 
指針所指向的內存區:從指針的值所代表的那個內存地址開始,長度爲sizeof(指針所指向的類型)的一片內存區。(一個指針指向了某塊內存區域,就相當於說該指針的值是這塊內存區域的首地址) 
指針本身所佔據的內存區:用函數sizeof(指針的類型)可以測出指針本身所佔據的內存區(在 32位平臺裏,指針本身佔據了 4個字節的長度) 
 
3.指針的算術運算 
指針和整數進行加減:一個指針 ptrold加(減)一個整數 n後,結果是一個新的指針ptrnew,ptrnew 的類型和 ptrold 的類型相同,ptrnew 所指向的類型和 ptrold所指向的類型也相同,ptrnew的值將比 ptrold 的值增加(減少)了n乘sizeof(ptrold所指向的類型)個字節。 
指針和指針進行加減:兩個指針不能進行加法運算,這是非法操作;兩個指針可以進行減法操作,但必須類型相同,一般用在數組方面。 
 
4. 運算符&和* 
&是取地址運算符,*是間接運算符。 
&a的運算結果是一個指針,指針的類型是a的類型加個*,指針所指向的類型是a的類型,指針所指向的地址嘛,那就是a的地址。 
*p的運算結果就五花八門了,總之*p 的結果是 p 所指向的東西,這個東西有這些特點:它的類型是 p指向的類型,它所佔用的地址是p所指向的地址。 
 
5. 數組和指針的關係 
數組的數組名其實可以看作一個指針。 
聲明瞭一個數組 TYPE array[n],則數組名稱array就有了兩重含義: 
第一,它代表整個數組,它的類型是 TYPE[n]; 
第二 ,它是一個常量指針,該指針的類型是TYPE*,該指針指向的類型是 TYPE,也就是數組單元的類型,該指針指向的內存區就是數組第0號單元,該指針自己佔有單獨的內存區,注意它和數組第0號單元佔據的內存區是不同的。該指針的值是不能修改的,即類似 array++的表達式是錯誤的。 
 
6. 指針和函數的關係 
可以把一個指針聲明成爲一個指向函數的指針,從而通過函數指針調用函數。讓我們舉一個例子來說明以下吧。 
int fun(char *,int); 
int (*pfun)(char *,int); 
pfun=fun; 
int a=(*pfun)("abcdefg",7); 
例中,定義了一個指向函數fun的指針pfun,把pfun作爲函數的形參。把指針表達式作爲實參,從而實現了對函數fun的調用。

 
對以上編程理解如下
1.定義整形變量a和整形指針p :int a=3,*p;
2.把變量a的地址賦給指針p,即p指向a :p=&a;
3.輸出變量a的值和指針p所指向變量的值 : printf("a=%d,*p=%d\n",a,*p);
4. 對指針p所指向的變量賦值,相當於對變量a賦值: *p=10;
5.將指針所指向變量加1 :(*p)++;


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