版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024八年級(jí)數(shù)學(xué)上冊(cè)第五章平行四邊形1平行四邊形的性質(zhì)第3課時(shí)平行線間的距離習(xí)題課件魯教版五四制
- 2024年呂梁客運(yùn)從業(yè)資格證
- 2024年哈爾濱駕考客運(yùn)資格證考試
- 2024年益陽(yáng)客運(yùn)從業(yè)資格證模擬考試練習(xí)題
- 2024年廣州客運(yùn)資格證培訓(xùn)考試題2024年
- 2024年寧夏駕駛員客運(yùn)從業(yè)資格證模擬考試題庫(kù)及答案
- 2024年烏魯木齊客運(yùn)員考試題庫(kù)及答案
- 2024年昆明客運(yùn)從業(yè)資格證考試
- 酒店員工勞動(dòng)合同協(xié)議(33篇)
- 物業(yè)公司工程結(jié)算協(xié)議書(3篇)
- 軸、平鍵強(qiáng)度計(jì)算表
- 事態(tài)升級(jí)管理流程-vda6.3
- 多維閱讀第14級(jí) Orphan Elephants 小象孤兒
- 經(jīng)修訂的國(guó)際救生設(shè)備規(guī)則(LSA)
- 居民死亡醫(yī)學(xué)證明(推斷)書
- 位移觀測(cè)記錄表
- 工藝紀(jì)律檢查管理辦法及考核細(xì)則
- 成都關(guān)于成立芯片公司組建方案(模板參考)
- 常德市自來(lái)水公司供水稽查管理制度
- 采購(gòu)項(xiàng)目驗(yàn)收管理辦法(共10頁(yè))
- 新余市職業(yè)教育現(xiàn)代學(xué)徒制試點(diǎn)工作方案
評(píng)論
0/150
提交評(píng)論