国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

論指針中需要認(rèn)真辨識(shí)的3組概念

2020-10-21 05:40賴玲
關(guān)鍵詞:數(shù)組存儲(chǔ)空間指針

賴玲

摘 要:通過對(duì)指針中3組容易混淆的概念研究,介紹了它們的辨識(shí)方法,以具體實(shí)例為依據(jù),介紹了對(duì)數(shù)據(jù)加工和處理的方法,有助于夯實(shí)編程基礎(chǔ),促進(jìn)編程能力的提高.

關(guān)鍵詞:指針;地址;數(shù)組;函數(shù)

中圖分類號(hào):TP312? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):1673-260X(2020)03-0022-03

指針是C語言中的一個(gè)重要概念,是其最具特色的部分,是C語言的精華,同時(shí)也是C語言的難點(diǎn).指針除了能動(dòng)態(tài)地分配地址,表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在調(diào)用函數(shù)的時(shí)候能夠得到1個(gè)以上的結(jié)果外,在系統(tǒng)軟件的設(shè)計(jì)也是非常重要的.筆者在實(shí)際的教學(xué)和學(xué)生的實(shí)際編程指導(dǎo)中發(fā)現(xiàn),很多學(xué)生對(duì)“指針變量的定義符”和“指針變量的取值運(yùn)算符”“指針函數(shù)”和“函數(shù)指針”“指針數(shù)組與數(shù)組指針”等概念混淆不清;認(rèn)真辨識(shí)有關(guān)概念,礪清它們間的相互關(guān)系,對(duì)于編制簡(jiǎn)潔、緊湊、高效的應(yīng)用程序非常有用,下面談?wù)剳?yīng)該辨識(shí)的幾個(gè)概念.

1 “指針變量的定義符”和“指針變量的取值運(yùn)算符”

操作符“*”既可以用來作為指針變量的定義符,也可以用作指針變量的取值運(yùn)算符.要根據(jù)“*”操作符出現(xiàn)的位置進(jìn)行判斷.

例1 int i=3, *p;

p=&i;

printf("%d",*p);

scanf("%d",p);

*p=5;

程序的第一句“int i=3;*p;”定義了一個(gè)整型變量i和一個(gè)整型的指針變量p,i里面只能存放整型變量的值,p(這里P前面的操作符“*”就是指針變量的定義符)里面只能存放整型變量的地址,i的初始值為3,執(zhí)行“p=&i;”中的“&”是取地址操作符,“p=&i;”將i的地址存到指針變量p的空間里面,也可以理解為將指針變量p指向整型變量i的首地址,見圖1所示.

程序中的第三句,以十進(jìn)制整數(shù)的形式輸出*p,對(duì)于*p理解十分重要,這里p前面的操作符“*”就是取值運(yùn)算符,就是p當(dāng)前所指向變量i的存儲(chǔ)空間里面存放的內(nèi)容3.第四句是向指針變量p所指向的空間輸入十進(jìn)制整型數(shù)據(jù),等價(jià)于scanf("%d",&a),第五句是用5覆蓋指針變量p所指存儲(chǔ)空間里面的內(nèi)容,等價(jià)于“i=5;”,因?yàn)閜是指向整型變量i的首地址,“*p=5;”就是將p當(dāng)前所指向變量i的存儲(chǔ)空間里面的內(nèi)容修改為5,這是間接尋址方式.

這里辨識(shí)的原則:一級(jí)指針變量中存放目標(biāo)變量的地址,凡是在聲明的語句中出現(xiàn)的操作符“*”是指針變量定義符,如例1程序第1行中的操作符“*”;在操作和控制部分出現(xiàn)的操作符“*”就是取值運(yùn)算符,如例1程序第3行和第5行中的操作符“*”.

對(duì)于取值的理解一定要注意取值的內(nèi)容,對(duì)于一級(jí)指針,取得內(nèi)容為“指針?biāo)赶虼鎯?chǔ)空間里面的內(nèi)容”即存儲(chǔ)空間的值,對(duì)于二級(jí)指針或者多級(jí)指針有“取存儲(chǔ)空間的地址”和“取存儲(chǔ)空間里面的內(nèi)容”的區(qū)別.

例2 int a,*p,**pp;

a=22;

p=&a;

pp=&p;

printf("%p,%d",*pp, **pp);

假設(shè)變量a的地址為4000,指針p的地址為4100,二級(jí)指針pp的地址為4800,a、p、pp三者的關(guān)系如圖2所示.

由圖2可以看出,a的地址為4000,保存在指針變量p中,p指向a,p的地址為4100,保存在pp中,即二級(jí)指針pp指向指針變量p,此時(shí),要引用a的值,可以使用*p,也可以使用**pp.注意:雖然p、pp都是指針變量,但p和pp指向的內(nèi)容有著本質(zhì)上的不同,p指向的是普通變量的地址,pp只能指向指針變量的地址而不能指向普通變量的地址.

也就是說,二級(jí)指針的指針變量中存放的是一級(jí)指針變量的地址,對(duì)于指針變量的定義符和一級(jí)指針一樣,只要是在聲明語句中出現(xiàn)的操作符“*”都是指針變量的定義符,例2中第1行中的操作符“*”和操作符“**”都是指針變量的定義符,第5行“printf("%p,%d",*pp,**pp);”中“*pp”的“*”和“**pp”前面的“*”是指針變量取值運(yùn)算符,只不過它們?nèi)≈档膬?nèi)容不一樣,“*pp”取的是目標(biāo)對(duì)象的地址,“**pp”也就是“*(*pp)”,取的是目標(biāo)對(duì)象的內(nèi)容.

2 “指針數(shù)組”與“數(shù)組指針”

2.1 “指針數(shù)組”

對(duì)于給定的一個(gè)數(shù)組,其元素都是存放同一類型數(shù)據(jù)的地址,這樣的數(shù)組稱為“指針數(shù)組”. “指針數(shù)組”其本質(zhì)為數(shù)組,只不過數(shù)組元素是同一類型數(shù)據(jù)的地址.例如:

int *p[4];

這里定義了一個(gè)指針數(shù)組,該數(shù)組的每個(gè)元素是整形變量的地址.對(duì)于“*p[4]”可以這樣理解,由于“[ ]”操作符比“*”操作符的優(yōu)先級(jí)高,因此p先與操作符“[ ]”結(jié)合,形成p[4]形式,這顯然是數(shù)組的形式,表示p數(shù)組里面有4個(gè)元素,p[4]中的p再與前面的操作符“*”結(jié)合,“*”是指針類型定義符,表示此數(shù)組是個(gè)指針類型,每個(gè)數(shù)組元素都可以指向一個(gè)整型變量.*p[i]相當(dāng)于*(p[i]),都表示下標(biāo)為i元素的地址,因?yàn)椴僮鞣癧 ]”優(yōu)先級(jí)高于操作符“*”.

注意:這里提到的優(yōu)先級(jí),操作符“()”高于操作符“[ ]”高于操作符“*”.

2.2 “數(shù)組指針”

“數(shù)組指針”也稱為行指針,是指向數(shù)組地址的指針,其本質(zhì)為指針.其定義形式為:

(*指針變量名)[長(zhǎng)度]

例如:int (*P)[n]

這里操作符“()”的優(yōu)先級(jí)比操作符“[ ]”優(yōu)先級(jí)高,“(*P)”表示是個(gè)指針,再與操作符“[ ]”結(jié)合,表示“數(shù)組指針”,“長(zhǎng)度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長(zhǎng)度,也就是二維數(shù)組的列數(shù).

例3

main()

{int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int *q,(*p)[4];

for(p=a;p

{ for(q=p[0];q

printf("%5d",*q);

}

}

本程序的目的是輸出二維數(shù)組的各元素,使用了普通的指針變量和二維數(shù)組的行指針,行指針指向二維數(shù)組的首地址(p=a),p++跳過的是一行,而不是一個(gè)元素.

兩者的區(qū)別:數(shù)組指針只是一個(gè)指針變量,占有目標(biāo)對(duì)象一個(gè)地址的存儲(chǔ)空間;指針數(shù)組是多個(gè)指針變量,以數(shù)組的形式存儲(chǔ)在內(nèi)存當(dāng)中,占有多個(gè)指針的存儲(chǔ)空間.

3 “指針函數(shù)”與“函數(shù)指針”

3.1 指針函數(shù)

指針函數(shù)是指返回值是指針的函數(shù),即本質(zhì)是一個(gè)函數(shù).函數(shù)返回值是某一類型的指針.其定義形式為:

類型標(biāo)識(shí)符 *函數(shù)名(參數(shù)表)

int *f(x,y);

首先它是一個(gè)函數(shù),這個(gè)函數(shù)的返回值是一個(gè)地址值.

3.2 函數(shù)指針

如果在程序中定義了一個(gè)函數(shù),編譯器在程序編譯之后,會(huì)為每個(gè)函數(shù)分配一個(gè)入口地址,即該函數(shù)第一條指令的地址,這個(gè)地址就是函數(shù)的指針.函數(shù)指針是指向函數(shù)的指針變量,其本質(zhì)是一個(gè)指針變量.

int (*f) (int x); /*聲明一個(gè)函數(shù)指針*/

f=func; /*將func函數(shù)的首地址賦給指針f */

一般情況下,我們可以用一個(gè)指針來保存這個(gè)地址,而這個(gè)指針就是函數(shù)指針,該指針可以看作是它指向函數(shù)的別名,所以我們可以用該指針來調(diào)用這個(gè)函數(shù).

例4 用函數(shù)指針變量作函數(shù)參數(shù)實(shí)例,從鍵盤任意輸入兩個(gè)整數(shù),求其最大值.

include"stdio.h"

int max (int x,int y)

{

return x>=y?x:y;

}

void main()

{

int a,b,c;

int (*p)(int x,int y);

scanf("%d,%d",&a,&b);

p=max;

c=(*p)(a,b);

printf("a=%d,b=%d,max=%d\n",a,b,c);

}

程序中max (int x,int y)是已經(jīng)定義的函數(shù),用來求兩個(gè)數(shù)的最大值.函數(shù)int (*p)(int x,int y)中p先與操作符“*”結(jié)合,是指針變量,然后再與后面的操作符“()”結(jié)合,表示此指針變量指向函數(shù),這個(gè)函數(shù)的返回值是個(gè)整數(shù).

程序中的第11行“p=max;”將指針變量p指向了“max (int x,int y)”函數(shù)的入口地址,即p指向函數(shù)max ( ).a,b的值分別傳遞給x,y.函數(shù)的返回值是a,b的最大值.

必須注意:(1)一個(gè)指向函數(shù)的指針必須確保該函數(shù)被定義且分配了內(nèi)存,否則它將指向一個(gè)空地址,這是程序設(shè)計(jì)的大忌!

(2)要注意“int (*p)(int x,int y);”中第一個(gè)括號(hào)的位置.如果寫成 “int *p (int x,int y);”情形,由于操作符“( )”高于操作符“*”,這就不是一個(gè)指向函數(shù)的指針了,它就成了聲明聲明一個(gè)函數(shù),這個(gè)函數(shù)的返回值一個(gè)int類型的地址.

(3)給函數(shù)的指針變量賦值時(shí)只賦函數(shù)名,不允許帶參數(shù).如第11行“p=max;”.

(4)發(fā)生函數(shù)調(diào)用的時(shí)候可以通過函數(shù)名,也可以通過函數(shù)的指針,本例中的調(diào)用形式“c=(*p)(a,b);”用函數(shù)指針調(diào)用的參數(shù)與函數(shù)調(diào)用的參數(shù)完全一致,用函數(shù)指針變量調(diào)用函數(shù)時(shí),只需要將“(*p)”代替函數(shù)名.

(5)對(duì)指向函數(shù)的指針變量不允許做加減運(yùn)算,如:p++、p—、p+n都是錯(cuò)誤的.

4 使用指針,一定要注意指針當(dāng)前的指向

使用指針可以方便訪問內(nèi)存,具有很強(qiáng)的靈活性,但在設(shè)計(jì)程序的時(shí)候,一定要留意指針當(dāng)前的指向.下面的程序企圖利用指針輸出數(shù)組中的元素.

例5 利用指針知識(shí)給數(shù)組元素賦值,再將數(shù)組中的各元素輸出.

main()

{ int i,*p,a[7];

p=a;

for(i=0;i<7;i++)

scanf("%d",p++);

printf("\n");

for(i=0;i<7;i++,p++)

printf("%d",*p);

}

程序中的第一個(gè)for語句實(shí)現(xiàn)了對(duì)數(shù)組元素賦值的功能,for結(jié)束的時(shí)候,執(zhí)行“p++”,指針已經(jīng)指向數(shù)組以后的空間.執(zhí)行第二個(gè)for語句,由于p所指的空間不是數(shù)組a的起始地址,執(zhí)行目標(biāo)地址取值運(yùn)算符“*p”時(shí),就無法和數(shù)組元素建立聯(lián)系,所以,就實(shí)現(xiàn)不了項(xiàng)目所要求的具體功能,為了解決這個(gè)問題,必須在程序的第6行后添加“p=a;”指令,使指針變量p重新指向數(shù)組a的首地址,才能實(shí)現(xiàn)項(xiàng)目所要求的具體功能.

5 結(jié)束語

程序設(shè)計(jì)中涉及的概念很多,對(duì)數(shù)據(jù)加工和處理的方法也靈活多變,只有認(rèn)真厘清知識(shí)間的相互關(guān)系,認(rèn)真辨析指針中常用的有關(guān)概念,注意指針當(dāng)前的指向,腳踏實(shí)地認(rèn)認(rèn)真真的書寫每行程序,才是編寫出符合要求的程序.

參考文獻(xiàn):

〔1〕任正云,李素若.C語言程序設(shè)計(jì)(第三版)[M].北京:中國(guó)水利水電出版社,2016.

〔2〕譚浩強(qiáng).C語言程序設(shè)計(jì)教程(第3版)[M].北京:高等教育出版社,2006.

〔3〕徐士良,等.C語言程序設(shè)計(jì)教程(第三版)[M].北京:人民郵電出版社,2009.

〔4〕[美]K.N.King著,呂秀峰,黃倩譯.C語言程序設(shè)計(jì):現(xiàn)代方法(第2版)[M].北京:人民郵電出版社,2010.

〔5〕[美]Stephen Prata著,云巔工作室譯.C Primer Plus(第五版)中文版【M】.北京:人民郵電出版社,2005.

〔6〕劉軍.C程序設(shè)計(jì)教學(xué)探討[J].電腦知識(shí)與技術(shù),2011(06).

猜你喜歡
數(shù)組存儲(chǔ)空間指針
JAVA稀疏矩陣算法
蘋果訂閱捆綁服務(wù)Apple One正式上線
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
用了就回不去的APP
用好Windows 10保留的存儲(chǔ)空間
郊游
更高效用好 Excel的數(shù)組公式
為什么表的指針都按照順時(shí)針方向轉(zhuǎn)動(dòng)
尋找勾股數(shù)組的歷程
淺析C語言指針
循化| 岢岚县| 天祝| 日喀则市| 江油市| 临沂市| 乾安县| 广汉市| 深州市| 青州市| 宽城| 扎鲁特旗| 清新县| 红河县| 托克逊县| 辽阳县| 滨州市| 兰溪市| 明水县| 云梦县| 醴陵市| 宿松县| 五原县| 新乐市| 清新县| 双城市| 台北市| 会东县| 尉氏县| 桓仁| 闻喜县| 河池市| 南涧| 锦州市| 高州市| 英超| 桦甸市| 丽水市| 炎陵县| 仙桃市| 兰考县|