1. 程式人生 > >C語言指針

C語言指針

c 指針

第一、 指針和常數

常數是不能直接幅值給指針的,如果想給指針幅常數,需要如下操作:

int cal=8;

int *pcal=&cal;

pcal指向8存儲的地址,*pcal為該地址存儲的數據8。

第二、 指針和數組

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

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

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

從以上可以看出:

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

進一步延伸,如下:

a 、int *data[3] 為指針數組,數組中每個元素為一個指向int型數據的指針,賦值如下:

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

  int *data[3]={arry,arry+1,arry+2};

  data[0]為指向arry首地址,*data[0]為該地址存放的數據1。data為data數組的首地址,*data和data[0]都為數組arry的首地址。其實也可以說定義了三個數組 data[0], data[1]和data[2]。

b、int(*data)[3]為一數組指針,為一數組,每個元素為存放一個地址,賦值如下:

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

  int (*data)[3]=&arry;

  那麽*data就為第一個元素的地址,**data就為第一個地址所在的元素1。

  第三、 指針與結構體

struct PERSON

  {

  char *pername;

  int age;

  }person;

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

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

  如果結構體定義為

  struct PERSON

  {

  char pername[20];

  int age;

  }person;

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

  第四、 指針與函數

  指向函數的指針在linux

操作系統中很常見

  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;//給指針函數賦值


本文出自 “大李子” 博客,謝絕轉載!

C語言指針