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語言指針