第一、 指針和常數
指針在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"是不能通過的,究其原因就是結構體爲抽象數據類型,不分配存儲單元,所以數組賦值不通過。如果採用指針賦值,那麼可以解決這類問題。
第四、 指針與函數
指向函數的指針在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;//給指針函數賦值