【C++】指針解析

第一、 和常數

     指針在32位機器中佔4個字節。

  對於學習過指針的同學都知道,常數是不能直接幅值給指針的,如果想給指針幅常數,需要如下操作:

  int num=8;

  int *pnum=#

  這時我們需要注意,pnum指向8存儲的地址,*pnum爲該地址存儲的數據8。

第二、 指針和數組

  指針和數組有着天然的聯繫,其實數組就是一個連續地址存放着常數,我們看下面一個例子:

  int arry[3]={1,3,5};

  那麼arry就是該數組的首地址,*arry就是該數組首地址存放的數據1,*(arry+1)則爲該數組的第二個位置存放的數據3.

  從以上分析可以看出:

  *arry和arry[1]同樣指向該數組的首個元素。

  那麼可以在進一步延伸,如下:

數組指針和指針數組 :

這兩個名字不同當然所代表的意思也就不同。我剛開始看到這就嚇到了,主要是中文太博大精深了,整這樣的簡稱太專業了,把人都繞暈了。從英文解釋或中文全稱看就比較容易理解。

指針數組:array of pointers,即用於存儲指針的數組,也就是數組元素都是指針

數組指針:a pointer to an array,即指向數組的指針

還要注意的是他們用法的區別,下面舉例說明。

int* a[4]     指針數組     

                 表示:數組a中的元素都爲int型指針    

                 元素表示:*a[i]   *(a[i])是一樣的,因爲[]優先級高於*

int (*a)[4]   數組指針     

                 表示:指向數組a的指針

                 元素表示:(*a)[i]  

注意:在實際應用中,對於指針數組,我們經常這樣使用:

1
2
typedef int* pInt;
pInt a[4];

第三、 指針與結構體

  這個也是一個很有趣的方面,先看一個例子:

  struct PERSON

  {

  char *pername;

  int age;

  }person;

  如果想給*pername幅值,那麼可以如下操作:

  person.pername="jack";//用指針,可以完成賦值

  如果結構體定義爲

  struct PERSON

  {

  char pername[20];

  int age;

  }person;

  那麼person.pername[20]="jack"是不能通過的,究其原因就是結構體爲抽象數據類型,不分配存儲單元,所以數組賦值不通過。如果採用指針賦值,那麼可以解決這類問題。

第四、 指針與函數

  指向函數的指針在操作系統中很常見,現在拿個簡單的例子來進行說明:

  int print(int a, int b ,char *p)

  { printf("in put number sum is %d,input string is %s\n",a+b,p);//三個參數,int int和char*

  return a+b;}

  int main()

  {

  int (* pprint)(int,int,char *);//定義指向函數print的指針函數*pprint,三個參數,int int和char*

  pprint=print;//給指針函數賦值

  int c;

  c=pprint(3,6,var);

  printf("%d\n",c);//輸出print的return值

  }

  從上面這個例子中可以看出,一個函數其實就是從一個地址開始的特殊功能程序,其函數名就爲該程序的首地址,所以可以這麼給指針函數賦值:pprint=print;//給指針函數賦值

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