版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第一章C語言概述第二章數(shù)據(jù)類型、運(yùn)算符與表達(dá)式第三章最簡單的C程序設(shè)計(jì)第四章邏輯運(yùn)算和判斷選取控制第五章循環(huán)控制第六章數(shù)組第八章編譯預(yù)處理第九章指針第十章結(jié)構(gòu)體與共用體第十二章文件的基本操作第十三章位運(yùn)算§9.4字符串指針和指向字符串的指針變量一、字符串指針的定義例:#include<stdio.h>
main()
{charp;
chars[]="Iamastudent!";
p=s;
printf("p=%s",p);}形式charp;表示p為指針變量,可指向一個(gè)字符串的首地址。運(yùn)行結(jié)果為:p=Iamastudent!可以在定義的時(shí)候賦初值:
main()
{charp="Iamastudent!";
…或者:main() {charp; p="Iamastudent!"; …則:p代表I(p+3)代表m1.“…”一個(gè)串名代表示該串的首地址2.在輸入(scanf)和輸出(printf)中,也可用%s將整個(gè)串一次輸入/輸出例:將字符串a(chǎn)復(fù)制到字符串b1)用字符數(shù)組實(shí)現(xiàn)1)main(){chara[]="Iamateacher!";charb[20];inti; for(i=0;(a+i)!='\0';i++)
(b+i)=(a+i);
(b+i)='\0'; printf("stringais:%s\n",a); printf("stringbis:"); for(i=0;b[i]='\0';i++) printf("%c",b[i]); printf("\n");}等價(jià)于:printf("stringbis:%s\n",b);運(yùn)行結(jié)果:stringais:Iamateacher!stringbis:Iamateacher! main() {chara[]="Iamateacher!"; charb[20],p1,p2; p1=a;p2=b; for(;p1!='\0';p1++,p2++)
p2=p1;
p2='\0'; printf("stringais:%s\n",p1);printf("stringbis:%s\n",p2);}2)用指針變量實(shí)現(xiàn)運(yùn)行結(jié)果:stringais:Iamateacher!stringbis:Iamateacher!請思考:對上面的程序作如下改變:main(){chara[]="Iamateacher";charb[20],*p1,*p2;p1=a;p2=b;p2=p1;則b數(shù)組中的內(nèi)容是否已復(fù)制了a數(shù)組中的內(nèi)容結(jié)論:p1=a;p2=a;p1a;p2b;p1a;p2p2=p1后;b二、字符串指針作函數(shù)參數(shù)例:用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制
與數(shù)值變量指針一樣,字符串指針,字符串?dāng)?shù)組均可作為函數(shù)參數(shù)作用:可在函數(shù)中改變實(shí)參內(nèi)容。方法:(1)字符數(shù)組作參數(shù)
voidcopy_string(from,to) charfrom[],to[]; {inti=0; while(from[i]!='\0'){to[i]=from[i];i++}to[i]='\0';}main(){chara[]="Iamateacher";charb[]="Youareastudent";printf("string_a=%s\nstring_b=%s\n",a,b);copy_string(a,b);printf("\nstring_a=%s\nstring_b=%s\n",a,b)}運(yùn)行結(jié)果:string_a=Iamateacher string_b=Youareastudent string_a=Iamateacher string_b=Iamateacher 可以在main中使用字符串指針:
chara="Iamateacher".;
charb="Youareastudent."…但以字符串的方式輸出b中內(nèi)容時(shí),遇到第一個(gè)'\0'時(shí)結(jié)束。實(shí)際上,數(shù)組b中的內(nèi)容為:Iamateacher\0nt\0(2)形參用字符指針變量
voidcopy_string(from,to)charfrom,to;{for(;from!='\0';from++,to++)
to=from;
to='\0';}或:將for改用whilewhile(from!='\0'){to=from;to++;from++;}或:while((to=from)!='\0'){from++;to++;}或:while((to++=from++)!='\0');實(shí)際上'\0'的ASCII碼為0,故可將
while((to++=from++)!=0)簡化為:while(to++=from++)字符數(shù)組作參數(shù)的實(shí)、形參調(diào)用的四種情況 實(shí)參 形參 數(shù)組名 數(shù)組名 數(shù)組名 指針型 指針型 指針型……
指針型 數(shù)組名小結(jié):三、字符數(shù)組與字符指針變量若用指針變量,即可將整個(gè)字符串賦給指針名:
charaa="GoodMorning!";
前面介紹中,字符數(shù)組與字符指針變量在使用中具有一定的統(tǒng)一性,但它們之間仍有以下區(qū)別:1.賦值方式不同:對字符數(shù)組只能對各個(gè)元素賦值,不可將整個(gè)串賦給數(shù)組名,即:chara[14];a="GoodMorning!";—是錯(cuò)誤的2.定義數(shù)組后,系統(tǒng)給它分配內(nèi)存單元。具有確定的內(nèi)存地址,但指針變量定義后,若未對它賦地址,則它并不指向任何單元。
如果:chara;scanf("%s",a);
則:系統(tǒng)十分危險(xiǎn),由于a可能指向一個(gè)系統(tǒng)單元,因此,就會破壞該單元的值。應(yīng)改為:charstr[10],a;a=&str[0];或a=str;scanf("%s",a);3.指針變量的值可以改變,而數(shù)組名(首地址)是不可改變的,即:在程序中不可直接對數(shù)組名賦值。下面的用法不允許:
charstr[]="Good!"; str=str+7;4.指針變量在確定了值后,可以采用數(shù)組元素的方法引用指向的值:
chara[]="Good"; charb=&a[0]; printf("%c",b[2]):5.可用指針變量(代表一個(gè)字符串)存放格式控制序列,即:
charformat format="a=%d,b=%f\n"; printf(format,a,b);
當(dāng)然,format也可為一數(shù)組,但賦值時(shí)不如指針變量那樣方便。§9.5函數(shù)的指針及指向函數(shù)的指針變量
基本概念:前面已述,每一個(gè)變量有地址,于是可用一個(gè)指針變量來保存,而一個(gè)函數(shù)實(shí)際上為存放在內(nèi)存中的一段程序,它有一個(gè)入口地址––––稱為函數(shù)的指針。存放函數(shù)指針的變量–––指向函數(shù)的指針變量。一、用函數(shù)指針變量調(diào)用函數(shù)1.函數(shù)指針變量的定義形式:類型標(biāo)識符(變量名)()例:int(p)();表示p為一個(gè)函數(shù)指針變量,用于存放一個(gè)函數(shù)的入口地址,但該函數(shù)的返回值必須為int型。2.給函數(shù)指針變量賦值函數(shù)指針變量=函數(shù)名;它不是實(shí)參,不是調(diào)用,而是將入口地址賦給該變量。3.通過函數(shù)指針變量調(diào)用函數(shù)的方法
(函數(shù)指針變量名)(實(shí)參表列)例:求a、b中最大者函數(shù)。intmax(x,y)intx,y;{intz;z=(x>y)?x:y;return(z);}main(){intmax();int(p)();
inta,b,c;p=max;scanf("a=%d,b=%d",&a,&b);c=(p)(a,b)printf("maxvalue=%d",c)/*將p指向函數(shù)max*//*調(diào)用函數(shù)*/二、函數(shù)指針變量作為函數(shù)參數(shù)
意義:當(dāng)一個(gè)函數(shù)被調(diào)用后,執(zhí)行過程中可以根據(jù)實(shí)參的函數(shù)名來調(diào)用不同的函數(shù)。前面介紹過:簡單變量、數(shù)組名、指針變量均可作為函數(shù)的參數(shù)。可以用函數(shù)指針變量作為函數(shù)的參數(shù)。例:sub(x1,x2)int(x1)(),(x2)();{inta,b,i,j;a=(x1)(i);b=(x2)(i,j)
}于是,可用sub(f1,f2)或sub(f3,f4)調(diào)用sub,表示執(zhí)行sub時(shí),根據(jù)實(shí)參傳遞過來的函數(shù)入口地址而調(diào)用f1,f2或f3,f4.例2.
設(shè)計(jì)一個(gè)函數(shù)process,每次實(shí)現(xiàn)不同的功能,當(dāng)用不同的函數(shù)名作實(shí)參調(diào)用process時(shí),process再去調(diào)用相應(yīng)的函數(shù)。程序如下:
#include<stdio.h> main() {intmax(),min(),add(); inta,b; printf("enteraandb:"); scanf("%d,%d",&a,&b); printf("max="); process(a,b,max); printf("min=") process(a,b,min); printf("sum="); process(a,b,add); } max(x,y) intx,y; {intz; if(x>y)z=x; elsez=y; return(z); } min(x,y) intx,y; {intz; if(x<y)z=x; elsez=y; return(z); } add(x,y) intx,y; {intz; z=x+y; return(z); }process(x,y,fun)intx,y;int(*fun)();{intresult;result=(*fun)(x,y);printf("%d\n",result);}注:當(dāng)用函數(shù)名作參數(shù)時(shí),不論函數(shù)返值類型如何均應(yīng)作說明,以與變量名相區(qū)別。運(yùn)行情況如下:
enteraandb:2,6 max=6 min=2 sum=8§9.6返回指針值的函數(shù)
既然函數(shù)返回值可以是整、實(shí)型等數(shù)據(jù)。當(dāng)然也可以是指針值,只是函數(shù)定義形式略有不同:例:
有若干個(gè)學(xué)生的成績(每個(gè)學(xué)生有4門課程),要求在用戶輸入學(xué)生序號以后,能輸出該學(xué)生的全部成績。用指針函數(shù)來實(shí)現(xiàn)。類型標(biāo)識符函數(shù)名(形參表列) float*search(float(*pointer[4],intn);); float*p; inti,m; printf("enterthenumberofstudent:"); scanf("%d",&m); printf("ThescoresofNo.%dare:\n",m);程序如下:{staticfloatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};main() p=search(score,m);/*函數(shù)調(diào)用*/ for(i=0;i<4;i++) printf("%5.2f\t",*(p+i)); }float*seaarch(pointer,n)/*返回指針值的函數(shù)*/ float(*pointer)[4]; intn; {float*pt; pt=*(pointer+n); return(pt); }運(yùn)行情況如下:
enterthenumberofstudent:1 ThescoresofNo.1are: 56.0089.0067.0088.00§9.7指針數(shù)組和指向指針的指針一、指針數(shù)組1.定義形式類型說明符數(shù)組名[常量]數(shù)組–––同種類型的數(shù)據(jù)集合。當(dāng)每一個(gè)元素均為指針類型數(shù)據(jù)時(shí),該數(shù)組被稱為指針數(shù)組。例:intp[10];p為指針型數(shù)組,其每一個(gè)元素為一指針型變量。用來存入一組地址。靈活。
字符串長度不一,于是只得以最長字符串的長度作為二維數(shù)組列數(shù),造成空間浪費(fèi)。一般情況下,存放一組字符串,如一組書名,也可用二維字符數(shù)組存放,但存在二個(gè)問題:2.優(yōu)越性如:存放一組字符串如:Applicationofcomputer\0English\0
用指針數(shù)組(一維)保存各字符串首地址,且交換時(shí)只需交換指針數(shù)組各元素––首地址即可解決上述二個(gè)問題。
在對字符串排序時(shí),若交換數(shù)組元素,時(shí)間太長。例:將若干字符串按字母順序(由小到大)輸出。#include<stdio.h>#include<string.h> main() {voidsort(); voidprint(); staticchar*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computerdesign"}; inti;n=5;
sort(name,n);print(name,n);}
printf("Beforesort:\n");
for(i=0;i<5;i++)
printf("mane[%d]=%s\n",i,name[i]);voidsort(name,n) char*name[];intn; {char*temp; inti,j,k;for(i=0;i<n-1;i++) {k=i; for(j=i+1;j<n;j++) if(strcmp(name[k],name[j])>0)k=j; if(k!=i) {temp=name[i],name[i]=name[k];name[k]=temp;} }}} voidprint(name,n) char*name[];intn; {inti;printf("Aftersort:\n"); for(i=0;i<n;i++) printf("name[%d]=%s\n",i,name[i]);}運(yùn)行結(jié)果為:Beforesort:name[1]=BASICname[2]=GreatWallname[3]=FORTRANname[4]=ComputerdesignAftersort:name[1]=Computerdesignname[2]=FORTRANname[3]=Followmename[4]=GreatWallname[0]=Followmename[0]=BASIC
一個(gè)數(shù)據(jù)變量有地址,可用一指針變量來存放該地址。那么一指針變量也有地址,可否用另一個(gè)指針變量來存放?回答是肯定的。&p&xpppx定義形式:intp,pp;二、指向指針的指針將指針變量的概念深化:例:
main() {staticchar*name[]={"Followme","BASIC","GreatWall","FORTRAN","Computerdesign"}; char**p; inti; for(i=0;i<5;i++) {p=name+i; printf("%s\n",*p);} }運(yùn)行結(jié)果如下:
Followme BASIC GreatWall FORTRAN Computerdesignname[1]name[0]name[2]name[3]name[4]a[1]=3a[0]=1a[2]=5a[3]=7a[4]=9p注意:一組字符串只能用指針數(shù)組存放:
charname[]={"Good","Bad","Are","Teacher",};于是每一個(gè)元素name[i]為字符串指針變量
charp;p=&name[i];或p=name+i;則:
p就表示第i個(gè)字符串的首地址
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024宅基地地基承包合同示范文本農(nóng)村土地經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議3篇
- 2024年度制造業(yè)員工勞動合同范本及安全生產(chǎn)協(xié)議3篇
- α-貯存池病病因介紹
- 新疆警察學(xué)院《產(chǎn)品設(shè)計(jì)進(jìn)階》2023-2024學(xué)年第一學(xué)期期末試卷
- 外籍廚師合同范例
- 推廣合同范例文本
- 駕校新員工服務(wù)培訓(xùn)
- 入股創(chuàng)業(yè)合同范例
- 閃銀借款合同范例
- 授權(quán)單位合作合同范例
- 控股集團(tuán)公司組織架構(gòu)圖.docx
- 深色刺繡中國風(fēng)工作總結(jié)PPT模板
- 國家和行業(yè)職業(yè)衛(wèi)生標(biāo)準(zhǔn)簡介(電力行業(yè))
- 《新媒體文案寫作》試卷2
- 采礦學(xué)課程設(shè)計(jì)_圖文
- 《管理學(xué)原理與方法》周三多第六版
- 土石壩沉降及其實(shí)測數(shù)據(jù)分析計(jì)算
- plc--病床呼叫系統(tǒng)
- 永煤集團(tuán)順和煤礦液壓銷齒彎道推車機(jī)技術(shù)規(guī)格書
- 九型人格測試之180題(完整版)和答案解析
- LS-MASTER-K-指令手冊
評論
0/150
提交評論