1、指針指向變量:
下面有這樣一個代碼塊:
int?main()
{int?a=10;int?b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void?test(int?x,int?y)
{int?tmp;tmp=x;x=y;y=tmp;}
最后輸出的結(jié)果還是a=10,b=15。因為在函數(shù)調(diào)用時,實參和形參之間只是值傳遞。但我們使用指針結(jié)果就不一樣了,如:
int?main()
{int?a=10;int?b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return? 0;}
void?test(int?*?x,int?*y)
{int?tmp;tmp=*x;*x=*y;*y=tmp;}
輸出結(jié)果a=15,b=10。變量a和b的值發(fā)生了交換。這是因為我們利用指針訪問變量的存儲單元,間接修改變量的值。
2、指針指向數(shù)組:
定義一個數(shù)組并初始化,int?array[5]={2,5,12,7,8},定義一個指針變量并把數(shù)組的地址賦給它,int? *p=array,注意數(shù)組名就是數(shù)組的地址,而且數(shù)組的地址就是首元素的地址。因此我們的指針變量就指向了數(shù)組的首元素,*p=2。如果把(p+1),那么指針變量就指向了數(shù)組的下一個元素5,因此我們可以利用指針來遍歷數(shù)組的各個元素:
int?main()
{int?array[5]={2,5,12,7,8};int?*p?=array;for(int? i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return?0;}
3、指針指向字符串:
我們都知道用數(shù)組存儲字符串,如char?name[20]="jack",上面已經(jīng)簡單講述了指針指向數(shù)組,所以我們可以這樣做,char? *name="jack",指針變量指向字符串的首個字符并可以依次訪問字符串的各個字符。
4,指針指向函數(shù):
我們需要知道怎樣表示一個指針指向函數(shù),說白了就是語法要正確,下面我也取一個代碼塊來說明一下:
int?sum(int?x,int?y)
{return?x+y;}
int?main()
{int?a=5;int?b=6;int?(*p)(int,int);p=sum;int?result=(*p)(a,b);printf("The? result?is?%d\n",result);return?0;}
不難發(fā)現(xiàn)上面代碼塊里語句(*p)(a,b)可以用p(a,b)來代替,因為p和sum就是一樣的,只是用前者可能更容易理解一點。而我們要知道怎樣定義一個指針指向函數(shù),int? (*p)(int,int)這是固定寫法,前面的int是指針將來指向的函數(shù)的返回值的類型,如果沒有函數(shù)返回值,那就是void,后面括號里的兩個int? 當然就是指針將指向的函數(shù)的形參。指針指向函數(shù)用起來確實有點抽象,要想熟練運用的話就多去做一些這方面的練習吧!
5,指針指向結(jié)構(gòu)體:
我們首先首先定義一個結(jié)構(gòu)類型,
struct?student
{
char?*name;
int?ages;
};
再根據(jù)類型定義結(jié)構(gòu)體變量?struct?student?stu={"Rose",15};定義一個指針指向結(jié)構(gòu)體類型,struct?student? *p;把結(jié)構(gòu)體變量stu的地址賦給指針變量p,p=&stu;我們可以有3種方式來訪問結(jié)構(gòu)體中的屬性ages:
stu.ages=15;(*p).ages=15;p->ages=15;不過第三種方式在C語言中只能用來指向結(jié)構(gòu)體。
相關(guān)c語言-指針學習資料
指針
http://www.makeru.com.cn/live/1392_238.html?s=156461?
指針換裝你還認識嗎
http://www.makeru.com.cn/live/5413_2043.html?s=156461?