計(jì)算機(jī)程序設(shè)計(jì) 第3章 指針_第1頁(yè)
計(jì)算機(jī)程序設(shè)計(jì) 第3章 指針_第2頁(yè)
計(jì)算機(jī)程序設(shè)計(jì) 第3章 指針_第3頁(yè)
計(jì)算機(jī)程序設(shè)計(jì) 第3章 指針_第4頁(yè)
計(jì)算機(jī)程序設(shè)計(jì) 第3章 指針_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第3章指針本章主要內(nèi)容指針概念指針的運(yùn)算指針與數(shù)組指針變量作為函數(shù)參數(shù)返回指針值的函數(shù)(指針函數(shù))指向函數(shù)的指針main函數(shù)的參數(shù)指向指針的指針帶著疑問(wèn)學(xué)習(xí)這個(gè)指針的類型是什么?指針?biāo)傅臄?shù)據(jù)類型是什么?該指針指向了哪里(指針的值、指針指向的內(nèi)存區(qū))?指針本身所占據(jù)的內(nèi)存區(qū)3.1指針概念1、內(nèi)存與地址

☆內(nèi)存中的每個(gè)位置由一個(gè)獨(dú)一無(wú)二的地址標(biāo)識(shí)

☆內(nèi)存中的每個(gè)位置都包含一個(gè)值

☆地址與內(nèi)容(eg.)0x000000000x000000010x000000100x00000011……0xFFFFFFFC0xFFFFFFFD0xFFFFFFFE0xFFFFFFFF2、值與類型(eg.)3、變量的指針和指針變量

變量的指針就是變量的地址,指針變量的值就是該指針變量所指變量的內(nèi)存首地址

*p就表示指針變量p所指向的變量(取值)指針概念4、間接訪問(wèn)指針概念112-13.14100108

inta=112,b=-1; floatc=3.14; int*d=&a;//int*d;d=&a; float*e=&c;//int*e;e=&c;100104108112116abcde可以通過(guò)*d,*e來(lái)操作a與c變量5、指針變量的定義[存儲(chǔ)類型]數(shù)據(jù)類型*指針變量名[=初始值];

eg:inti,j;

int*p1,*p2; p1=&i; p2=&j;

畫圖說(shuō)明指針概念說(shuō)明:指針變量所指向的類型可以是整、實(shí)、字符型等。

指針變量只能指向同一類型的變量。

指針變量是p1、p2,而不是*p1、*p2。*p1和*p2是p1和p2所指向的變量i和j。

指針變量中只能存放地址。

p1=100;*p1=&i;非法指針概念6、未初始化和非法指針

eg:int*a;*a=12;

question1:指針a指向哪里?

question2:萬(wàn)一a存放的是合法地址呢?7、NULL指針指針概念8、指針、間接訪問(wèn)和左值

eg:inta; int*d=&a; *d=10-*d;

d=10-*d;9、指針、間接訪問(wèn)和變量

eg:*&a=25; *100=25;

*(int*)100=25;//指針常量指針概念10、指針變量的引用 運(yùn)算符:取地址--&

取內(nèi)容--*(地址運(yùn)算符)

(1)指針變量p的內(nèi)容為地址量;*p為指針p的目標(biāo)量,內(nèi)容為數(shù)據(jù),即指針變量p所指向的變量的值。 (2)*p=i;是將變量i的值賦給目標(biāo)變量*p

(3)p=&i;是將變量i的地址賦給指針變量p。 (4)&p為指針變量p的地址。 (5)&(*p)的結(jié)果為p,即變量*p的地址。 (6)*(&i)的結(jié)果就是i本身。指針概念右圖中:P==2000*p==3&p==3010&(*p)==2000*(&i)==3指針概念例3.1main(){ inta,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;/

將變量a和b的地址賦給指針變量p1和p2/printf(“%d,%d\n”,a,b);printf(“%d,%d\n”,*p1,*p2);/*p1和*p2就是變量a和b/}運(yùn)行結(jié)果:100,10100,10指針概念注意:本題中a和b并未交換,而p1和p2的值改變。例3.2

main()

{int*p1,*p2,*p,a,b;

scanf(“%d,%d”,&a,&b);

p1=&a;p2=&b;

if(a<b){p=p1;p1=p2;p2=p;}

printf(“a=%d,b=%d\n”,a,b);printf(“max=%d,min=%d\n”,*p1,*p2);

}運(yùn)行情況:

5,9

a=5,b=9

max=9,min=5指針概念3.2指針的運(yùn)算3.2.1指針的算術(shù)運(yùn)算

++/--+/-

分析*p++與(*p)++3.2.2指針的關(guān)系運(yùn)算

==/!=3.3指針與數(shù)組1、指向一維數(shù)組的指針例:inta[10],*p;p=&a[0];//將a[0]元素的地址賦給指針 //變量p

在C中,數(shù)組名代表數(shù)組的首地址。因此,p=a;p=&a[0];注:p=a;//將a數(shù)組的首地址賦給指針變量p //這里的a并不代表整個(gè)數(shù)組。

通過(guò)指針引用數(shù)組元素

p

=

a

;/*將整型數(shù)組a的首地址賦給指針變量

p*/

*p=5;/*將5賦給a數(shù)組的第一個(gè)元素a[0],等價(jià)于

a[0]=5*/

p+1表示:指針變量p當(dāng)前所指的數(shù)組元素的下一個(gè)元素,不是p的值加

1

。若有p=&a[0],則

p+i

(或a+i)就是

a[i]

的地址(因?yàn)閍代表數(shù)組a的首地址)。若有p=&a[0],則*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即a[i]。即:*(p+i)=*(a+i)=a[i]。

指向數(shù)組的指針變量可以帶下標(biāo),如:

p[i]

*(p+i)指向一維數(shù)組的指針也可寫成如下:main(){inta[10],*p=a

,i

;for(

i=0;i<10;i++)scanf(“%d”,p++);printf(“\n”);

p=a;/

此語(yǔ)句必不可少

/for(

i=0;i<10;i++,p++)printf(“%d”,*p);}例3.3輸出有10個(gè)元素的整型數(shù)組a的元素值。main(){inta[10],*p,i

;for(i=0;i<10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(p=a;p<(a+10);p++)printf(“%d”,*p);}指向一維數(shù)組的指針

如果p指向數(shù)組a

(即p=a),則:p++(或p+=1)表示p指向下一個(gè)元素;*p表示取得當(dāng)前所指元素之值。*p++

*(p++)a[i++]

表示先求*p,再p+1p(*p--類似)*(++p)a[++i],表示p+1p,再求*p。(*p)++a[i]+1。

注意指向數(shù)組的指針變量的當(dāng)前值,因?yàn)橹羔樋梢灾赶驍?shù)組最后一個(gè)元素以后的內(nèi)存單元。指向一維數(shù)組的指針

staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}};說(shuō)明:

行地址

a

:代表整個(gè)二維數(shù)組的首地址,也是第0行的首地 址,值為&a[0][0]。

a+2:代表第2行的首地址,值為&a[2][0]

列地址

a[0]

*(a+0)&a[0][0]:代表0行0列的首地址

a[1]

*(a+1)&a[1][0]:代表1行0列的首地址

a[0]+1

*(a+0)+1&a[0][1]a[1]+2

*(a+1)+2&a[1][2]。

*(a+1)+2不能寫成*(a+1+2),否則就變成*(a+3),即a[3]。2、指向多維數(shù)組的指針因?yàn)閍[0]+1

*(a+0)+1&a[0][1]

所以*(a[0]+1)

*(*(a+0)+1)a[0][1]

同理,*(*(a+0)+1)

*(*a+1)a[0][1],*(a[

i

]+j)

*(*(a+i)+j)a[

i

][j]一維數(shù)組a[i]:代表第i+1個(gè)元素所占的內(nèi)存單元。二維數(shù)組a[i]:代表一維數(shù)組名,a[i]本身不占用內(nèi)存單元,只是一個(gè)地址務(wù)必記?。?(a+i)a[i]地址:a、a+i、a[

i

]、*(a+i)、*(a+i)+j、a[

i

]+j值:*(a[

i

]+j)

*(*(a+i)+j)a[

i

][j]。staticinta[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}在一維數(shù)組中:a+i指第i個(gè)數(shù)組元素的存儲(chǔ)單元;在二維數(shù)組中:a+i=a[i]=*(a+i)=&a[i]=&a[i][0],都表示i行0列元素的地址值。在二維數(shù)組中&a[i]并不是a[i]單元的物理地址,但能得到i行的首地址。例3.4輸出二維數(shù)組中的任一元素。main(){

staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};int(*p)[4],i,j;p=a;scanf(“i=%d,j=%d”,&i,&j

);printf(“a[%d,%d]=%d\n”,i,j,*(*(p+i)+j));}運(yùn)行情況:i=1,j=2/*

注意這里的輸入格式*/a[1,2]=13程序中的“int(*p)[4]”表示

p

是一個(gè)指向包含4個(gè)元素的一維數(shù)組的指針變量,即p是一個(gè)行指針,指向一維數(shù)組的首地址。由于運(yùn)算符優(yōu)先級(jí)的關(guān)系,這里的(*p)[4]不能寫成*p[4]。一、字符串的表示形式

用字符數(shù)組實(shí)現(xiàn)

staticcharstr[]=“IloveChina!”;str[i]表示字符數(shù)組中的第i+1個(gè)字符。如:str[8]為字符‘h’

用字符指針實(shí)現(xiàn)

char*a=“IloveChina!”;

盡管沒(méi)有定義為字符數(shù)組,但實(shí)際在內(nèi)存開辟了一個(gè)字符數(shù)組用來(lái)存放字符串常量。同樣,a[8]為字符‘h’。注意:

a不是字符串變量,此處將“IloveChina!”的首地址賦給指針變量a。3、字符串的指針二、字符串指針作函數(shù)參數(shù)

可以用地址傳遞的方式,即用字符數(shù)組名作參數(shù)或用指向字符串的指針變量作參數(shù),將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù)。例3.5用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制。

用字符數(shù)組作參數(shù)voidcopy_string(charfrom[],charto[]){inti=0;while(from[i]!=‘\0’){to[i]=from[i];i++;}to[i]=‘\0’;}main(){chara[]=“Iamateacher.”;charb[]=“youarestudents.”;copy_string(a,b);printf(“string_a=%s\nstring_b=%s\n”,a,b);}運(yùn)行結(jié)果:string_a=Iamateacher.string_b=Iamateacher.

形參用字符指針變量voidcopy_string(char*from,char*to){for(;*from!=‘\0’;from++;to++)

*to=*from;

*to=‘\0’;}main(){

char*a=“Iamateacher.”;char*b=“youarestudents.”;copy_string(a,b);printf(“string_a=%s\nstring_b=%s\n”,a,b);}說(shuō)明:字符數(shù)組:由若干個(gè)元素組成,每個(gè)元素可存放1

個(gè)字符。字符指針變量:存放的是字符串的首地址,絕不是將字符串存放到字符指針變量中。

字符數(shù)組:賦初值最好要用static存儲(chǔ)類別如:

staticstr[]={“IloveChina!”};

字符指針變量:賦初值不必加static,如:

char*a=“IloveChina!”;

這是因?yàn)樗皇菍?duì)指針變量初始化,而不是對(duì)數(shù)組初始化。字符數(shù)組:只能對(duì)各個(gè)元素賦值,下列方式錯(cuò)誤

charstr[15];str=“IloveChina!”;三、字符指針變量與字符數(shù)組

對(duì)字符指針變量賦初值時(shí):char*a=“IloveChina!”;等價(jià)于:

char*a; a=“IloveChina!”;即數(shù)組可以在變量定義時(shí)整體賦初值,但不能在賦值語(yǔ)句中整體賦值。注意:對(duì)數(shù)組初始化時(shí):

staticcharstr[14]={“IloveChina!”};不等價(jià)于:

charstr[14]; str[]=“IloveChina!”;字符指針變量:可采用char*a;a=“IloveChina!”;這里賦給a的是字符串的首地址,而不是字符串。

charstr[14]; scanf(“%s”,str);是可以的。但如果寫成如下形式:

char*a; scanf(“%s”,a);

是非常危險(xiǎn)的。因?yàn)橹羔樧兞繘](méi)有確定的地址而指向程序區(qū)或其它數(shù)據(jù)區(qū),從而會(huì)造成系統(tǒng)“沖突”。應(yīng)寫成如下形式:

char*a,str[10]; a=str; scanf(“%s”,a);

數(shù)組在編譯時(shí)被分配內(nèi)存單元,有確定的地址。而指針變量必須賦給一個(gè)確定的地址值,否則,在程序運(yùn)行時(shí)會(huì)發(fā)生意想不到的后果。如:

main() {

char*a=“IloveChina!”; a=a+7; printf(“%s”,a); }運(yùn)行結(jié)果如下:

China!下面的寫法是錯(cuò)誤的:

charstr[]={“IloveChina!”}; str=str+7; printf(“%s”,str);

若定義一個(gè)指針變量使它指向一個(gè)字符串后,可以用下標(biāo)形式引用指針變量所指字符串中的字符。

指針變量的地址值可以改變,而數(shù)組名的地址值不能改變。如:例3.6main(){

char*a=“IloveChina.”;inti=5;printf(“%c\n”,a[i]);for(i=7;a[i]!=‘\0’;i++)printf(“%c”,a[i]);}運(yùn)行結(jié)果如下:eChina.

可用指針變量指向一個(gè)格式字符串來(lái)代替printf函數(shù)中的格式字符串。也可以在定義字符數(shù)組賦初值時(shí)賦予一個(gè)格式字符串代替printf函數(shù)中的格式字符串。如:

char*format; format=“a=%d,b=%f\n”; printf(format,a,b);它相當(dāng)于:

printf(“a=%d,b=%f\n”,a,b);例3.7順讀和倒讀都一樣的字符串稱為“回文”,如:LEVEL。試編寫一個(gè)判斷輸入的字符串是否為回文的程序。#include“stdio.h”#include“string.h”main(){

chars[81],*pi,*pj;inti,j,n;gets(s);n=strlen(s);pi=s;pj=s+n-1;/pi和pj分別指向字符串首末/while(*pi==‘’)pi++;/

跳過(guò)輸入時(shí)的前導(dǎo)空格/while(*pj==‘’)pj--;/

跳過(guò)輸入時(shí)的尾隨空格/while((pi<pj)&&(*pi==*pj)) {pi++;pj--;}if(

pi<pj)printf(“NO\n”);elseprintf(“YES\n”);}4、指針數(shù)組char**p

;inti;for(i=0;i<5;i++){p=name+i;printf(“%s\n”,*p);}}定義形式:類型標(biāo)識(shí)符*數(shù)組名[數(shù)組長(zhǎng)度]例如:int*p[4];

定義了有4個(gè)元素的指針數(shù)組,每個(gè)數(shù)組元素都指向一個(gè)整型變量。例8.8

main()

{staticchar*name[]={“Followme”,“BASIC”,“GreatWall”, “FORTRAN”,“Computerdesign”};指向指針的指針作用:將一個(gè)變量的地址傳送至另一個(gè)函數(shù)中

例3.93.4指針變量作為函數(shù)參數(shù)用指針變量作參數(shù)調(diào)用函數(shù)能獲得多個(gè)值。此例中a和b的值交換,而s1和s2的值不變。3.5返回指針值的函數(shù)(指針函數(shù))定義形式:類型標(biāo)識(shí)符*函數(shù)名(參數(shù)表)

例如:int*fa(x,y);注意:指針函數(shù)VS指向函數(shù)的指針變量例:int*a(x,y);int(*a)();a為整型指針函數(shù)a為指向函數(shù)的指針變量3.6指向函數(shù)的指針一、用函數(shù)指針變量調(diào)用函數(shù)例3.10求兩數(shù)中的較大者。

main(){

intmax();int(*p)();/

定義p是指向函數(shù)的指針變量/inta,b,c;p=max;scanf(“%d,%d”,&a,&b);c=(*p)(a,b);printf(“a=%d,b=%d,max=%d”,a,b,c);}max(x,y)intx,y;{

intz;if(x>y)z=x;elsez=y;return(z);}函數(shù)的參數(shù)可以是:變量指向變量的指針變量數(shù)組名指向數(shù)組的指針變量函數(shù)指針變量函數(shù)指針變量作用:將函數(shù)名傳遞給形參,實(shí)現(xiàn)函數(shù)地址的傳遞。

二、用函數(shù)指針變量作函數(shù)參數(shù)3.7main函數(shù)的參數(shù)形式:main(intargc,char*argv[],char*env[])參數(shù)含義如下:argc

表示命令行的參數(shù)個(gè)數(shù)。a

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論