課程-15級語言第6章指針_第1頁
課程-15級語言第6章指針_第2頁
課程-15級語言第6章指針_第3頁
課程-15級語言第6章指針_第4頁
課程-15級語言第6章指針_第5頁
已閱讀5頁,還剩60頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1--存儲單元地址的使用第6章指針2教學(xué)目標(biāo)理解指針和指針變量的基本含義掌握指針的聲明和存放,初始化和指針變量的引用方法掌握指針作為函數(shù)的參數(shù)了解指向數(shù)組的指針掌握指向字符串的指針能在程序運(yùn)行時應(yīng)用動態(tài)分配預(yù)留新的存儲空間基本數(shù)據(jù)類型回顧數(shù)據(jù)類型:數(shù)據(jù)類型是對外界信息的抽象表示,便于計(jì)算機(jī)處理3數(shù)組浮點(diǎn)型整型字符型指針引入4除了上述值型數(shù)據(jù),C語言還能處理一類非常特殊的數(shù)據(jù)—內(nèi)存地址。計(jì)算機(jī)內(nèi)部有很多存儲單元,每個存儲單元都用唯一的地址編號(表示為一個整數(shù)加以相互區(qū)別),簡稱為地址。在C語言中,存儲地址也叫指針6.1指針與指針變量在C語言中,指針的重要特征:數(shù)據(jù)結(jié)構(gòu)總是位于計(jì)算機(jī)的內(nèi)存中,必有地址,即指針使用指針可以節(jié)約大量內(nèi)存空間指針使程序的不同部分能共享數(shù)據(jù),在數(shù)組作為函數(shù)的參數(shù)中已經(jīng)有所理解。程序能在運(yùn)行時能夠動態(tài)地管理內(nèi)存空間,指針顯得更為方便56.1指針與指針變量在C語言中,任何一個指向能存儲數(shù)據(jù)的內(nèi)存位置的表達(dá)式稱為左值(lvalue)x=1.0;x

6變量的名稱1.0變量的存儲單元2000變量的指針變量的值76.1指針與指針變量整型指針的存儲整型變量的存儲6.2指針變量的定義與引用

6.2.1指針變量的定義變量須先定義后使用使用指針變量前,必須先對它們進(jìn)行聲明。指針變量的聲明語法:基本數(shù)據(jù)類型說明符*標(biāo)識符名稱;(a)int指針變量(b)float指針變量(c)char指針變量如:int*ptr1;float*ptr2;char*ptr3;6.2.1指針變量的定義9說明:(1)定義指針變量時名稱前加*號。如:

char*ptrc,c;(2)聲明中出現(xiàn)的*不是運(yùn)算符,它只是表明被聲明的變量是指針變量。(3)指針變量可以被聲明為指向任何數(shù)據(jù)類型的變量。6.2.2指針變量的引用指針變量的使用方法同普通變量一致,都可以進(jìn)行賦值和取值操作10int*p1,m=3;float*p2,f=4.5;char*p3,ch='a';int*intPtr;p1=&m;p2=&f;p3=&ch;intPtr=p1;運(yùn)算符&的含義是取出變量m在內(nèi)存中的存儲指針6.2.2指針變量的引用11指針變量可以指向任何與之相一致的數(shù)據(jù)類型的變量,沒有賦值時,指針變量的值是不確定的,從而不能確定它具體的指向,只有為其賦值,指針變量才有意義對指針變量的引用形式為:*指針變量其含義是取出指針變量所指向內(nèi)存單元中的值

6.2.2指針變量的引用[例6.1]用指針變量進(jìn)行輸入、輸出。intmain(){int*p,m;scanf("%d",&m);/*&:取變量m的指針*/p=&m; /*指針p指向變量m*/printf("%d",*p);/**p是對指針?biāo)傅淖兞康囊?/p>

用形式,與m意義相同*/printf("%x",p);/*輸出指針變量p中的指針,指

針是以整數(shù)形式表示的*/return0;}

6.2.2指針變量的引用13指針變量可以在聲明時或在賦值語句中初始化。指針可以被初始化為0、NULL或普通變量的地址.如:intm=3;int*ptr=&m;double*dblPtr=0;int*strPtr=NULL;符號常量NULL在頭文件<stdio.h>中定義,表示數(shù)值0。把一個指針初始化為NULL和0是等價的用普通整型變量m的指針初始化變量dblPtr指針變量不指向任何浮點(diǎn)數(shù),空指針strPtr指針變量不指向任何整型數(shù),空指針6.2.2指針變量的引用14說明:盡可能使用初始化操作來初始化指針變量,以防止其指向一個未知的或未被初始化的內(nèi)存空間6.3指針運(yùn)算符與指針表達(dá)式6.3.1指針運(yùn)算符與指針表達(dá)式&運(yùn)算符

取址運(yùn)算符&m變量m的地址*運(yùn)算符

間接訪問運(yùn)算符*ptr所指向的變量取址運(yùn)算符及表達(dá)式15變量的定義類型&運(yùn)算符表達(dá)式含義charch;char&ch取出變量ch的指針doublex;double&x取出變量x的指針inti;int&i取出變量i的指針inta[10];int&a[1]取出數(shù)組元素a[1]的指針charstr[10];char&str取出數(shù)組元素str[0]的指針6.3.1指針運(yùn)算符與指針表達(dá)式間接訪問運(yùn)算符及表達(dá)式16變量的定義含義char*ptrch,ch;ptrch=&ch;printf("%c",*ptrch);定義指向char的指針變量ptrch和char變量ch取出變量ch的指針賦值給指針變量ptrch以字符方式輸出間接訪問ptrch所指向的指針中的值double*ptrx,x;ptrx=&x;printf("%lf",*ptrx);定義指向double的指針變量ptrx和double變量x取出變量x的指針賦值給指針變量ptrx以浮點(diǎn)數(shù)方式輸出間接訪問ptrx所指向的指針中的值int*ptri,i;ptri=&I;printf("%d",*ptri);定義指向int的指針變量ptri和int變量i取出變量i的指針賦值給指針變量ptri以整型方式輸出間接訪問ptri所指向的指針中的值6.3.1指針運(yùn)算符與指針表達(dá)式說明:*號在C語言中有三種含義,表示算術(shù)運(yùn)算中的乘法在變量聲明中指針變量的修飾符在表達(dá)式中的單目運(yùn)算符存儲單元中的值的訪問方式有兩種。通過變量名稱訪問,比如:inta[10],i=1;printf("%d”,a[i]);

通過指針間接訪問單元的值17#include<stdio.h>

intmain(){

int*ptra,*ptrb,a,b,t;/*定義指針變量與整型變量*/

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

ptra=&a;/*使指針變量指向整型變量*/

ptrb=&b;

if(*ptra<*ptrb){/*通過間接訪問形式交換兩個單元的值*/

t=*ptra;*ptra=*ptrb;*ptrb=t;

}

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

printf("*ptra=%d,*ptrb%d\n",*ptra,*ptrb);

return0;

}[例6.2]從鍵盤輸入兩個整數(shù),用間接訪問的形式由大到小的輸出這兩個數(shù)186.3.1指針運(yùn)算符與指針表達(dá)式程序運(yùn)行過程中,指針與所指的變量之間的關(guān)系196.3.1指針運(yùn)算符與指針表達(dá)式[例6.3]從鍵盤上輸入兩個整數(shù),按從大到小的順序輸出兩個整數(shù)的值。20#include<stdio.h>intmain(){int*ptra,*ptrb,a,b,*t;/*定義指針變量與整型變量*/scanf("%d,%d",&a,&b);ptra=&a;/*使指針變量指向整型變量*/ptrb=&b;if(*ptra<*ptrb){/*間接訪問交換兩個單元的值*/

t=ptra;ptra=ptrb;ptrb=t;}printf("%d,%d\n",a,b);printf("%d,%d\n",*ptra,*ptrb);return0;}

6.3.2指針變量作函數(shù)的參數(shù)指針變量作函數(shù)的參數(shù)的實(shí)質(zhì):

地址傳遞核心特點(diǎn):

共享內(nèi)存21考慮下列代碼,能實(shí)現(xiàn)參數(shù)值的互換嗎?voidswap0(intx,inty){intt=x;x=y;y=t;return;}不能,如何做才能將參數(shù)的值交換?6.3.2指針變量作函數(shù)的參數(shù)[例6.4]利用指針變量作為函數(shù)的參數(shù),設(shè)計(jì)函數(shù)swap實(shí)現(xiàn)兩個整數(shù)的交換。22#include<stdio.h>voidswap1(int*,int*);/*函數(shù)聲明,形參為指針型數(shù)據(jù)*/intmain(){ int*p1,*p2,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; swap(p1,p2);/*函數(shù)調(diào)用,實(shí)參為指針變量*/ printf("%d,%d\n",a,b); printf("%d,%d\n",*p1,*p2); return0;}/*實(shí)現(xiàn)將兩數(shù)值調(diào)整為由大到小*/voidswap1(int*pt1,int*pt2){intt;/*交換內(nèi)存變量的值*/if(*pt1<*pt2){t=*pt1;*pt1=*pt2;*pt2=t;}}/*實(shí)現(xiàn)將兩數(shù)值調(diào)整為由大到小*/voidswap2(int*pt1,int*pt2){ int*t;//交換 if(*pt1<*pt2){

t=pt1; pt1=pt2; pt2=t;

}}6.3.3返回指針的函數(shù)函數(shù)可以返回整型、實(shí)型、字符型等類型的數(shù)據(jù),還可以返回地址值-即返回指針值。返回指針值的函數(shù)定義:類型名*函數(shù)名(參數(shù)表);

例如:

int*fun(intx,inty);

表示fun是返回整型指針的函數(shù),返回的指針值指向一個整型數(shù)據(jù)。236.3.3返回指針的函數(shù)[例6.5]返回兩個數(shù)中大數(shù)地址的函數(shù)。#include<stdio.h>int*fun(int,int);intmain(){inti,j,*p;printf("entertwonumtoi,j:");scanf("%d%d",&i,&j);p=fun(i,j);/*調(diào)用fun,返回大數(shù)地址,賦值給指針變量p*/printf("max=%d\n",*p);/*打印p指向的數(shù)據(jù)*/return0;}24/*fun函數(shù)返回形參x,y中較大數(shù)的指針

*/int*fun(intx,inty){int*z;if(x>y)z=&x;elsez=&y;returnz;}程序運(yùn)行結(jié)果:輸入:entertwonumtoi,j:218輸出:max=186.4指針與數(shù)組對數(shù)組來說,數(shù)組名就是數(shù)組在內(nèi)存存儲區(qū)域范圍的首地址,即是一個指針,只不過這個指針是一個常量。指針變量可以用于存儲變量的地址,當(dāng)然也可存放數(shù)組的指針或數(shù)組元素的指針對數(shù)組而言,數(shù)組和數(shù)組元素的引用,也可以通過使用指針的方式進(jìn)行間接訪問256.4.1指針與一維數(shù)組26例intarray[10];int*p;p=&array[0];//p=array;或int*p=&array[0];或int*p=array;數(shù)組名是表示數(shù)組首地址的地址常量array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p6.4.1指針與一維數(shù)組指針間接訪問數(shù)組元素:ptr+n與a+n表示數(shù)組元素a[n]的地址,即&a[n]。對整個a數(shù)組來說,共有10個元素,n的取值為0~9,則數(shù)組元素的地址就可以表示為ptr+0~ptr+9或a+0~a+9,與&a[0]~&a[9]保持一致。間接訪問*(ptr+n)和*(a+n)就表示為數(shù)組的各元素即等效于a[n]。指向數(shù)組的指針變量也可用數(shù)組的下標(biāo)形式表示為ptr[n],其效果相當(dāng)于*(ptr+n)27inta[10],*ptr; /*聲明數(shù)組與指針變量*/ptr=a;/*或者:ptr=&a[0];稱為ptr指向數(shù)組a*/6.4.1指針與一維數(shù)組例6.6以數(shù)組的不同引用形式輸入輸出數(shù)組各元素#include<stdio.h>intmain(){ inti,a[10]; for(i=0;i<=9;i++) scanf("%d",a+i); printf("\n"); for(i=0;i<=9;i++) printf("%4d",a[i]); printf("\n"); return0;}28程序運(yùn)行結(jié)果:輸入:12345678910輸出:12345678910#include<stdio.h>intmain(){inti,a[10],*ptr=a;for(i=0;i<=9;i++)scanf("%d",ptr+i);printf("\n");for(i=0;i<=9;i++)printf("%4d",*(ptr+i));printf("\n");return0;}#include<stdio.h>intmain(){inti,a[10];for(i=0;i<=9;i++)scanf("%d",a+i);printf("\n");for(i=0;i<=9;i++)printf("%4d",*(a+i));printf("\n");return0;}#include<stdio.h>intmain(){inti,a[10],*ptr=a;for(i=0;i<=9;i++) scanf(“%d”,&ptr[i]);printf(“\n”);for(i=0;i<=9;i++) printf(“%4d”,ptr[i]);printf(“\n”);return0;}#include<stdio.h>intmain(){inti,a[10],*ptr=a;for(i=0;i<=9;i++) scanf(“%d”,ptr++);printf("\n");ptr=a;for(i=0;i<=9;i++) printf(“%4d”,*ptr++));printf(“\n”);return0;}#include<stdio.h>intmain(){inti,a[10],*ptr=a;for(i=0;i<=9;i++) scanf(“%d”,ptr++);printf(“\n”);for(i=0;i<=9;i++) printf(“%4d”,*ptr++);printf(“\n”);return0;}合適嗎?ptr=a;6.4.2指針與二維數(shù)組若定義一個二維數(shù)組:inta[3][4];29a[0]a[0][0]a[0][1]a[0][2]a[0][3]a[1]a[1][0]a[1][1]a[1][2]a[1][3]a[2]a[2][0]a[2][1]a[2][2]a[2][3]行地址數(shù)組元素6.4.2指針與二維數(shù)組二維數(shù)組在內(nèi)存中的存放和指針與二維數(shù)組的關(guān)系30a[0]4062196a[0][0]4062200a[0][1]4062204a[0][2]4062208a[0][3]4062212a[1][0]4062216a[1][1]4062220a[1][2]4062224a[1][3]4062228a[2][0]4062232a[2][1]4062236a[2][2]4062240a[2][3]a[1]a[2]二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1

(2)&a[1][0](3)a[1](4)*(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+231表示形式含義地址a二維數(shù)組名,數(shù)組首地址,指向一維數(shù)組a[0],即第0行首地址a[0],*(a+0),*a第0行第0列元素地址a+1,&a[1]第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值40621964062196406221240622124062220元素值為56.4.2指針與二維數(shù)組例6.10用地址法輸入輸出二維數(shù)組各元素32#include<stdio.h>intmain(){inta[3][4];inti,j;for(i=0;i<3;i++)for(j=0;j<4;j++) scanf("%d",a[i]+j);for(i=0;i<3;i++){for(j=0;j<4;j++) printf("%4d",*(a[i]+j)); printf("\n");}return0;}

#include<stdio.h>intmain(){inta[3][4];inti,j;for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%d",a[i]+j);for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%4d",*(a[i]+j));printf("\n");}return0;}

6.4.3數(shù)組指針作函數(shù)的參數(shù)例6.12編寫函數(shù),利用指針參數(shù)實(shí)現(xiàn)求解一維數(shù)組中的最大元素intmax(intx[],intn){ intmaxv=x[0]; inti; for(i=1;i<n;i++) if(maxv<x[i]) maxv=x[i]; returnmaxv;}33測試程序的main()函數(shù)中調(diào)用部分如下:ptr=a;maxvalue=max(ptr,10);6.4.3數(shù)組指針作函數(shù)的參數(shù)實(shí)

參形

參數(shù)組名數(shù)組名數(shù)組名指針變量指針變量數(shù)組名指針變量指針變量346.4.3數(shù)組指針作函數(shù)的參數(shù)例6.14將一個班級中若干名同學(xué)的不同課程的成績累計(jì)求和,輸出同學(xué)的成績和與總分大于均分的同學(xué)分析:選用二維數(shù)組作為學(xué)生成績的存儲結(jié)構(gòu),每個同學(xué)的成績就是二維數(shù)組中的一行,每一列表示同學(xué)的某門課程的成績。在實(shí)現(xiàn)時,我們用二維數(shù)組的指針作函數(shù)的參數(shù),實(shí)現(xiàn)對二維數(shù)組的按行相加,當(dāng)然還可以另外定義一個存儲學(xué)生的信息。此處,我們只描述學(xué)生的成績信息。356.4.4指針與字符數(shù)組C語言允許使用兩種方法實(shí)現(xiàn)一個字符串的引用。字符數(shù)組字符串366.4.4指針與字符數(shù)組例6.15簡單字符串的輸入和輸出#include<stdio.h>intmain(){ charstr[80]; gets(str); printf("%s\n",str); return0;}376.4.4指針與字符數(shù)組字符類型指針指向字符串,其定義的方法為:

charstr[80],*p;*p=str;例6-16字符數(shù)組的正確使用方法。38#include<stdio.h>intmain(){charstr[10],*p=str;inti;/*輸入的字符串長度超過10*/scanf("%s",str);for(i=0;i<10;i++)printf("%c",*p++);/*正確輸出*/printf("\n");p=str;/*字符數(shù)組無'\0'標(biāo)志,輸出出錯*/printf("%s",p); /*字符數(shù)組無'\0'標(biāo)志,輸出出錯*/puts(str); return0;}6.4.4指針與字符數(shù)組例6-17實(shí)現(xiàn)兩個字符串的復(fù)制、合并操作39voidstrcopy(char*s,constchar*t){while((*s=*t)!='\0'){ s++;t++;}}voidstrcat(char*s,char*t){/*移動串s到串尾*/while(*s)s++;/*將串t接在串s后,實(shí)現(xiàn)串的連接*/

while(*t)*s++=*t++;/*在串結(jié)尾處寫入結(jié)束符*/*s='\0';}

串復(fù)制時,串s的長度應(yīng)大于等于串t;串連接時,串s的長度應(yīng)大于等于串s與串t的長度之和。以免出現(xiàn)存儲的溢出。6.4.4指針與字符數(shù)組字符數(shù)組和字符(串)指針的區(qū)別存儲上的區(qū)別:字符數(shù)組元素存放一個字符,

字符指針存放是地址2

賦值上的區(qū)別:對字符數(shù)組只能對各個元素賦值(字符數(shù)組定義例外)??梢詫⒁粋€常量字符串賦值給字符指針,含義是將常量串首地址賦值給字符指針。如:charstr[100];str=”Iamastudent.”;//非法char*pstr;pstr=”Iamastudent.”;//合法406.4.4指針與字符數(shù)組3定義上的區(qū)別:定義數(shù)組后,編譯系統(tǒng)分配具體的內(nèi)存單元。定義指針變量,編譯系統(tǒng)只分配一個存儲單元,以存放地址值,這個值是隨機(jī)的,所以字符指針必須初始化才能使用。char*s[10];gets(s);//合法char*ps;get(ps);/*指針沒有一個確切的指向,非法*/運(yùn)算上的區(qū)別:指針變量的值允許改變(++,--,賦值等),而字符數(shù)組的數(shù)組名是常量地址,不允許改變。416.4.4指針與字符數(shù)組例6-18字符串?dāng)?shù)組的排序,使用指向二維數(shù)組的指針字符串排序主要依據(jù)字符串的字典順序排序42分析:我們定義一個字符串?dāng)?shù)組來存放多個字符串,每個字符串由兩部份構(gòu)成,如果第一部分一致,再根據(jù)第二部分排序,排序依據(jù)為字符串的字典順序。6.5指針的地址分配當(dāng)定義指針變量時,其變量的取值是隨機(jī)的,可能指向內(nèi)存的任一單元。若指針的指向是不安全的內(nèi)存地址,在該地址空間上的數(shù)據(jù)交換就會產(chǎn)生意料不到的效果.43在程序執(zhí)行時為指針變量所做的地址分配就稱之為動態(tài)內(nèi)存分配6.5指針的地址分配ANSIC標(biāo)準(zhǔn)建議使用兩個最常用的動態(tài)分配內(nèi)存的函數(shù)malloc()和free().包含在stdlib.h中函數(shù)原型為:void*malloc(size_tsize);voidfree(void*ptr);

malloc()用以向編譯系統(tǒng)申請分配內(nèi)存;

free()用以在使用完畢釋放掉所占內(nèi)存。446.5指針的地址分配例6-19兩個字符串的交換45#include<string.h>#include<stdio.h>intmain(){ char*ptr1,*ptr2,*temp; ptr1=(char*)malloc(30);/*動態(tài)為指針變量分配長度為30字節(jié)的存儲空間*/ ptr2=(char*)malloc(20); temp=(char*)malloc(30); printf("inputstr1:"); gets(ptr1);/*輸入字符串*/ printf("inputstr2"); gets(ptr2);6.5指針的地址分配46printf("str1------------str2\n"); printf("%s.......%s\n",ptr1,ptr2);

strcpy(temp,ptr1);/*串復(fù)制*/ strcpy(ptr1,ptr2); strcpy(ptr2,temp); printf("str1------------str2\n"); printf("%s.......%s\n",ptr1,ptr2);

free(ptr1); free(ptr2);free(temp); return0;}

例6-19續(xù)程序運(yùn)行結(jié)果:輸入:inputstr1:Helloinputstr2:world輸出:str1------------str2Hello.......worldstr1------------str2world.......Hello6.6指針數(shù)組一種特殊的數(shù)組,數(shù)組元素全部是指針,以替代變量本身在程序中的使用,增加靈活性。稱這類數(shù)組為指針數(shù)組。定義形式:類型標(biāo)識*數(shù)組名[數(shù)組長度];如:char*str[4];int*ptr[5];47整型數(shù)組,數(shù)組元素為整型數(shù)指針數(shù)組,數(shù)組元素為指針運(yùn)算符[]的優(yōu)先級比運(yùn)算符*高先是數(shù)組形式str[4],然后才是與“*”的結(jié)合,表示數(shù)組中有四個元素,每個元素都是一個指向字符數(shù)據(jù)的指針6.6指針數(shù)組說明:(1)指針數(shù)組是數(shù)組元素都為指針的數(shù)組,數(shù)組的指針,指的是數(shù)組的首地址。(2)注意與指向二維數(shù)組的行指針的區(qū)別。行指針聲明形式為:int(*ptr)[4],a[3][4],b[3][3];

說明指針變量ptr只能指向一個長度為4數(shù)組;ptr=a[0];//合法ptr=b[0];/*非法,數(shù)組b的行指針是一個長度

為3的一位數(shù)組*/48數(shù)組指針的定義為形式為:int*pt[4];6.6指針數(shù)組指針數(shù)組用的最多的是“字符型指針數(shù)組”,利用字符指針數(shù)組可以指向多個長度不等的字符串,使字符串處理更加方便、靈活,節(jié)省內(nèi)存空間,如圖496.6指針數(shù)組使用字符型指針數(shù)組指向多個字符串與使用兩維字符數(shù)組存儲多個字符串的比較:節(jié)省存儲空間(二維數(shù)組要按最長的串開辟存儲空間)便于對多個字符串進(jìn)行處理,節(jié)省處理時間(使用指針數(shù)組排序各個串不必移動字符數(shù)據(jù),只要改變指針指向的地址)506.6指針數(shù)組#include<string.h>#include<stdio.h>voidsort(char*name[],intn);intmain(){

char*CourseName[]={"CProgram","C++ObjectOrientedProgram“,"OperatingSystem","DataSturctureandAlgorithms" }; inti,n=4; sort(CourseName,n); for(i=0;i<n;i++) printf("%s\n",CourseName[i]); system("Pause"); return0;}51voidsort(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[j],name[k])<0)k=j; if(k!=i){ temp=name[i];name[i]=name[k];name[k]=temp; }}}字符串?dāng)?shù)組排序6.6指針數(shù)組若定義一個指針數(shù)組,對各元素的取值要注意安全性。

如:char*ptr[3];若:

scanf("%s",ptr[i]);則輸入的字符串在內(nèi)存的存放其地址由ptr[i]決定除非給指針數(shù)組元素賦值安全的地址。52包含三個指針,但指針的指向是不確定的,指針現(xiàn)在可能指向內(nèi)存的任一地址若ptr[i]沒有指向一個有效的地址,非法6.6指針數(shù)組例6.21對已排好序的字符指針數(shù)組進(jìn)行指定字符串的查找,符串按字典順序排列,采用二分法或折半查找53分析:折半查找算法描述:(1)輸入n個字符串,分別由指針數(shù)組的元素指向。按照字典順序排序,我們選用上例中的sort函數(shù)實(shí)現(xiàn)。(2)設(shè)low指向指針數(shù)組的低端,high指向指針數(shù)組的高端,mid=(low+high)/2(3)測試mid所指的字符串,是否為要找的字符串。(4)若按字典順序,mid所指的字符串大于要查找的串,表示被查字符串在low和mid之間,否則,表示被查字符串在mid和high之間。(5)修改low式high的值,重新計(jì)算mid,繼續(xù)尋找。

6.7指向指針的指針指針可以指向簡單變量、字符類型變量,當(dāng)然也可以指向指針類型變量。當(dāng)指向指針類型變量時,稱之為指向指針的指針變量,這是指針也稱為雙重指針。

定義:

類型標(biāo)識符**指針變量名;

546.7指向指針的指針如:float**ptr;由于指針運(yùn)算符“*”是自右至左結(jié)合,所以上述定義相當(dāng)于:

float*(*ptr);例6-22利用指向指針的指針變量對二維字符數(shù)組的訪問55定義一個指針變量ptr,它指向另一個指針變量(該指針變量又指向一個實(shí)型變量)#include<stdio.h>intmain(){ inti; staticcharc[][30]={"CProgram","DataStructure", "OperatingSystem","DataBaseSystem"}; staticchar*cp[]={c[0],c[1],c[2],c[3]};/*指針數(shù)組*/

staticchar**cpp;/*指向字符指針的指針變量*/

cpp=cp;/*將指針數(shù)組的首地址傳遞給指向字符指針的指針變量*/ for(i=0;i<4;i++)/*按行輸出字符串*/ printf("%s\n",*cpp++); printf("-----------\n"); for(i=0;i<4;i++){/*按行輸出字符串*/

cpp=&cp[i]; printf("%s\n",*cpp); } return0;}566.8指向函數(shù)的指針變量C語言規(guī)定函數(shù)的首地址即函數(shù)名,所以函數(shù)名就是函數(shù)的指針。指向函數(shù)的指針變量就是保存函數(shù)入口地址(函數(shù)指針)的變量,稱這種變量為指向函數(shù)的指針變量。定義:

類型(*函數(shù)指針變量名)();例如:int(*p)();57兩組括號()都不能少int表示被指向的函數(shù)的類型,即被指向的函數(shù)的返回值的類型6.8指向函數(shù)的指針變量使用方法有兩種:指向函數(shù)的指針變量的賦值,指向某個函數(shù):

函數(shù)指針變量名=函數(shù)名;利用指向函數(shù)的指針變量調(diào)用函數(shù):(*函數(shù)指針變量名)

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論