C語言指針詳解及用法示例
新手在C語言的學(xué)習(xí)過程中遇到的最頭疼的知識點(diǎn)應(yīng)該就是指針了,指針在C語言中有非常大的用處。下面我就帶著問題來寫下我對于指針的一些理解。
指針是什么?
指針本身是一個(gè)變量,它存儲(chǔ)的是數(shù)據(jù)在內(nèi)存中的地址而不是數(shù)據(jù)本身的值。它的定義如下:
int a=10,*p; p=&a int a=10; int *p=&a;
首先我們可以理解 int* 這個(gè)是要定義一個(gè)指針p,然后因?yàn)檫@個(gè)指針存儲(chǔ)的是地址所以要對a取地址(&)將值賦給指針p,也就是說這個(gè)指針p指向a。
很多新手都會(huì)對這兩種定義方法感到迷惑,其實(shí)他倆的意思是一樣的。第一種定義方法定義了int型的變量a和指針p,然后將a的地址賦給p。第二種是在定義指針p的同時(shí)將a的地址賦給指針p。我們姑且理解為" int * "是定義指針的標(biāo)志。
指針有什么用?
這樣我們就可以通過*p來找到指針?biāo)赶虻淖兞縜的地址,然后對地址中的值(值是10)進(jìn)行操作。
//接著上面的代碼 printf("%p",p) //結(jié)果是一個(gè)地址(p指向的變量a的地址)。 printf("%d",*p) //結(jié)果是10,變量a的值。 printf("%d",&p) //結(jié)果是一個(gè)地址(指針p的地址,因?yàn)橹羔樢彩且粋€(gè)變量自己也有地址的)
數(shù)組名和指針的區(qū)別?
數(shù)組名是一個(gè)地址,它可以被理解為一個(gè)常指針(它只能指向本數(shù)組首元素的地址)。而指針可以指其他的變量等等。
int str[5]={1,2,3,4,5}; int *p=str; printf("%d",*p); //輸出為1,數(shù)組的首元素。 printf("%d",*str); //輸出為1,數(shù)組的首元素。 printf("%d",str[0]); //輸出為1,數(shù)組的首元素。 printf("%p",p); //輸出為地址,數(shù)組的地址。 printf("%p",str); //輸出為地址,數(shù)組的地址。 printf("%d",*(p+1)); //輸出為2,數(shù)組的第二個(gè)元素。 printf("%d",*(srt+1)); //輸出為2,數(shù)組的第二個(gè)元素。
對照代碼大家可以很清晰的看到數(shù)組名在對內(nèi)存中存儲(chǔ)的數(shù)據(jù)進(jìn)行操作的方法和結(jié)果是一樣,但是數(shù)組名存儲(chǔ)自己數(shù)組本身的首地址。
什么是空指針,野指針?
在函數(shù)內(nèi)部對指針進(jìn)行賦值操作后,在函數(shù)執(zhí)行完畢后,該指針就成了一個(gè)空指針(變量從棧中彈出)。但是通過動(dòng)態(tài)地址分配(堆空間)的指針不會(huì)有上述問題。
free(p)后釋放內(nèi)存的指針為野指針。
關(guān)于const對于指針的限制問題
int a=10,b=20; int * const p=&a; //無法使p指向其他地址。 p=&b; //這樣的操作是不允許的。 *p=20; //可以這樣操作。 const int * p=&a; //p可以指向其他地址。 p=&b; //可以操作。 *p=10; //操作不被允許。 const int * const p=&a //p不能指向其他地址,也不能改變地址中的值。 p=&b; //操作不被允許。 *p=20; //操作不被允許。
const在int的左邊那就是不能修改地址中的值,在右邊就是不能指向其他地址,左右都有那就是既不能修改地址的值也不能指向其他地址。
新手常出現(xiàn)的問題我個(gè)人總結(jié)了上述幾點(diǎn),如果有錯(cuò)誤的地方希望大家留言交流互相學(xué)習(xí)。后面會(huì)寫下多維數(shù)組的存儲(chǔ)方式和指針的問題。
下面簡單介紹下c語言指針的幾種用法。
1、指針指向變量:
下面有這樣一個(gè)代碼塊:
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。因?yàn)樵诤瘮?shù)調(diào)用時(shí),實(shí)參和形參之間只是值傳遞。但我們使用指針結(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ā)生了交換。這是因?yàn)槲覀兝弥羔樤L問變量的存儲(chǔ)單元,間接修改變量的值。
2、指針指向數(shù)組:
定義一個(gè)數(shù)組并初始化,int array[5]={2,5,12,7,8},定義一個(gè)指針變量并把數(shù)組的地址賦給它,int *p=array,注意數(shù)組名就是數(shù)組的地址,而且數(shù)組的地址就是首元素的地址。因此我們的指針變量就指向了數(shù)組的首元素,*p=2。如果把(p+1),那么指針變量就指向了數(shù)組的下一個(gè)元素5,因此我們可以利用指針來遍歷數(shù)組的各個(gè)元素:
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ù)組存儲(chǔ)字符串,如char name[20]="jack",上面已經(jīng)簡單講述了指針指向數(shù)組,所以我們可以這樣做,char *name="jack",指針變量指向字符串的首個(gè)字符并可以依次訪問字符串的各個(gè)字符。
4,指針指向函數(shù):
我們需要知道怎樣表示一個(gè)指針指向函數(shù),說白了就是語法要正確,下面我也取一個(gè)代碼塊來說明一下:
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)來代替,因?yàn)閜和sum就是一樣的,只是用前者可能更容易理解一點(diǎn)。而我們要知道怎樣定義一個(gè)指針指向函數(shù),int (*p)(int,int)這是固定寫法,前面的int是指針將來指向的函數(shù)的返回值的類型,如果沒有函數(shù)返回值,那就是void,后面括號里的兩個(gè)int 當(dāng)然就是指針將指向的函數(shù)的形參。指針指向函數(shù)用起來確實(shí)有點(diǎn)抽象,要想熟練運(yùn)用的話就多去做一些這方面的練習(xí)吧!
5,指針指向結(jié)構(gòu)體:
我們首先首先定義一個(gè)結(jié)構(gòu)類型,
struct student { char *name; int ages; };
再根據(jù)類型定義結(jié)構(gòu)體變量 struct student stu={"Rose",15};定義一個(gè)指針指向結(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)的資料。
總結(jié)
以上就是本文關(guān)于C語言指針詳解及用法示例的全部內(nèi)容,希望對大家有所幫助。感謝朋友們對本站的支持!
上一篇:C語言創(chuàng)建動(dòng)態(tài)dll和調(diào)用dll(visual studio 2013環(huán)境下)
欄 目:C語言
下一篇:C++中strstr函數(shù)的實(shí)現(xiàn)方法總結(jié)
本文標(biāo)題:C語言指針詳解及用法示例
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1054.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)