C語言第7章-指針第1講課件_第1頁
C語言第7章-指針第1講課件_第2頁
C語言第7章-指針第1講課件_第3頁
C語言第7章-指針第1講課件_第4頁
C語言第7章-指針第1講課件_第5頁
已閱讀5頁,還剩95頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第7章指針

(一)C語言程序設(shè)計(jì)1第7章指針

(一)C語言程序設(shè)計(jì)1內(nèi)容提要指針概述 指針的概念為什么引入指針的概念指針變量作為函數(shù)參數(shù)字符指針作為函數(shù)參數(shù) 指針和數(shù)組間的關(guān)系一維數(shù)組的地址和指針二維數(shù)組的地址和指針內(nèi)容提要指針概述 為什么引入指針的概念鐵桿C/C++程序員最摯愛的武器:指針C/C++的高效、高能主要來自于指針很多不可能的任務(wù)由指針完成

為什么引入指針的概念鐵桿C/C++程序員最摯愛的武器:指針為什么引入指針的概念指針為函數(shù)提供修改變量值的手段

為C的動態(tài)內(nèi)存分配系統(tǒng)提供支持

為動態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹等)提供支持

可以改善某些子程序的效率

為什么引入指針的概念指針內(nèi)存的尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?通過變量的地址訪問變量所在的存儲單元兩種尋址方式直接(尋址)訪問通過變量地址直接存取變量內(nèi)容間接(尋址)訪問通過指針變量來間接存取它所指向的變量i_pointer=&i;內(nèi)存的尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?指針(Pointer)的概念指針也是一種數(shù)據(jù)類型指針變量聲明為指針類型的變量,專門存放地址數(shù)據(jù)的變量

指針(Pointer)的概念指針也是一種數(shù)據(jù)類型如何定義指針變量?定義指針變量int*p;定義了一個指針變量p,簡稱指針pp是變量,int*是類型指針變量初始化int*p,a;p=&a;*p與a完全等價(jià)如何定義指針變量?定義指針變量inti,*p;p=&i;

int*p;float*q;p=q;inti;float*p;p=&i;int*p;p=100;判斷是真?是假?指針變量只存放地址!一個指針變量不能指向與其類型不同的變量!我是真的,你猜對了嗎?應(yīng)在類型相同的指針變量之間賦值inti,*p;int*p;inti;int*p;&與*操作符&用來取變量的地址*用來取指針指向的內(nèi)存中的內(nèi)容int*p,a[10];

p=&a[0];*p=20;int*p,a[10];

p=&a[5];*p=20;inti=3,*p;

p=&i;printf(“*p=%d”,*p);int*p,a[10];

p=a;*p=20;等價(jià)于a[0]=20;&與*操作符&用來取變量的地址int*p,a[10];

指針變量與其它類型變量的對比共性在內(nèi)存中占據(jù)一定大小的存儲單元先定義,后使用特殊性

它的內(nèi)容只能是地址,而不能是數(shù)據(jù)必須初始化后才能使用,否則指向不確定的存儲單元,對該空間進(jìn)行訪問,將可能造成危險(xiǎn)可參與的運(yùn)算:加、減一個整數(shù),自增、自減、關(guān)系、賦值只能指向同一基類型的變量指針變量與其它類型變量的對比共性指針的指向只能指向同一基類型的變量,否則將引起warningfloatx;int*p=&x;TC編譯warning:SuspiciouspointerconversioninfunctionmainVC編譯warningC4133:'=':incompatibletypes-from'float*'to'int*'指針的指向只能指向同一基類型的變量,否則將引起warning指針運(yùn)算算術(shù)運(yùn)算short*p,a[10];p=a;p++;/*p的值增加多少?*/指針的加減運(yùn)算是以其指向的類型的字節(jié)長度為單位的6000600160026003600460056006p-1pp+1指針運(yùn)算算術(shù)運(yùn)算6000p-1pp+1指針運(yùn)算int*p,*q,a[10];

p=a;

q=&a[5];q-pq=p+5;指針運(yùn)算不能亂算一般只進(jìn)行指針和整數(shù)的加減運(yùn)算,同類型指針之間的減法運(yùn)算其它運(yùn)算,比如乘法、除法、浮點(diǎn)運(yùn)算、指針之間的加法等,并無意義,所以也不支持指針運(yùn)算int*p,*q,a[10];

p=a;

指針運(yùn)算關(guān)系運(yùn)算指向同一種數(shù)據(jù)類型的兩個指針才能進(jìn)行關(guān)系運(yùn)算值為1或0p>qp<qp==q不能與非指針類型變量進(jìn)行比較,但可與NULL(即0值)進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針P==NULLp!=NULL指針運(yùn)算關(guān)系運(yùn)算指針運(yùn)算賦值運(yùn)算指針在使用前一定要賦值為指針變量賦的值必須是一個地址main(){

int*p; scanf("%d",p);…}main(){

inta,*p=&a;scanf("%d",p);…}錯!但TC下不報(bào)錯VC下報(bào)錯指針運(yùn)算賦值運(yùn)算main()main()錯!指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)參數(shù)和返回值的類型指針做函數(shù)參數(shù)的經(jīng)典例子:兩數(shù)的互換指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)參數(shù)和返回值的類voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}

voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}程序1程序2例7.1~7.2:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參結(jié)果有何不同?NotWork!Why?main()main()程序1程序2例7.1~7.2:主調(diào)函數(shù)被調(diào)函數(shù)main(){

inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}voidSwap(intx,inty){

inttemp;temp=x;x=y;y=temp;}55ab實(shí)參形參99xyab程序1xy55temp9主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(intx,主調(diào)函數(shù)被調(diào)函數(shù)main(){

inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}voidSwap(int*x,int*y){

inttemp;temp=*x;*x=*y;*y=temp;}&a&a實(shí)參形參&b&bxyab程序2xy5temp5ab995主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(int*x簡單變量作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的比較1581581581515881581515a)調(diào)用Swap函數(shù)(b)執(zhí)行Swap函數(shù)c)從Swap函數(shù)返回tempxy

bmain函數(shù)Swap函數(shù)①②③aaatemptempxxy

ybb158815&a&b&a&b15(a)調(diào)用Swap函數(shù)

(b)執(zhí)行Swap函數(shù)

a

a

b

b

*x

*x

*y

*y

y

y

x

x

&a

&b

main函數(shù)

Swap函數(shù)temptemp②①③簡單變量作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的比較15815swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞voidSwap(intx,inty){

inttemp;temp=x;/*x,y為內(nèi)部變量*/x=y;y=temp;}swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞voidSwap(int*p1,int*p2){

int*p;p=p1;/*p1,p2為內(nèi)部變量*/p1=p2;p2=p;}swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址voidSwap(int*p1,int*p2){

int*p;/*指針p未初始化*/*p=*p1;*p1=*p2;*p2=*p;}swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址字符串與字符數(shù)組、字符指針C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符串一串以'\0'結(jié)尾的字符字符數(shù)組每個元素都是字符類型的數(shù)組charstring[100];字符指針指向字符類型的指針char*p;數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事字符串與字符數(shù)組、字符指針C語言并沒有為字符串提供任何專門的字符指針變量與字符數(shù)組的區(qū)別定義方法不同

charstr[10];

char*ptr;賦值方法不同

charstr[10];str=”china”;/*錯誤*/strcpy(str,”china”);/*正確*/

char*ptr;ptr=”china”;字符指針是變量,而數(shù)組名是地址常量字符指針變量與字符數(shù)組的區(qū)別定義方法不同使用字符指針的注意事項(xiàng)字符指針變量必須有明確的指向,否則使用是危險(xiǎn)的例如,輸入字符串時char*a;scanf("%s",a);/*錯誤*/

應(yīng)為:

char*a;

charstr[10];a=str;

scanf("%s",a);/*正確*/使用字符指針的注意事項(xiàng)字符指針變量必須有明確的指向,否則使用例7.5:字符串拷貝——用字符數(shù)組編程voidMyStrcpy(chardstStr[],charsrcStr[]){

inti=0;

while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}下標(biāo):01234567891011HelloChina\0HelloChina\0srcStr[i]dstStr[i]下標(biāo)移動方向dstStr[i]='\0'srcStrdstStr結(jié)束拷貝ii++

i

例7.5:字符串拷貝——用字符數(shù)組編程voidMyStvoidMyStrcpy(char*dstStr,constchar*srcStr){

while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}當(dāng)只允許函數(shù)訪問地址內(nèi)容,不允許修改時,可以把函數(shù)的指針參數(shù)定義為constHelloChina\0HelloChina\0*srcStr*dstStr指針移動方向指針移動方向*to='\0'dstStrsrcStr++srcStrsrcStrdstStr++dstStr例7.5:字符串拷貝——用字符指針編程voidMyStrcpy(char*dstStr,c例7.5:字符串拷貝——主函數(shù)程序#include<stdio.h>main(){ chara[80],b[80]; printf(“Pleaseenterastring:”); gets(a);

MyStrcpy(b,a); printf(“Thecopyis:”); puts(b);}例7.5:字符串拷貝——主函數(shù)程序#include<st例7.6:計(jì)算實(shí)際字符個數(shù)unsignedintMyStrlen(charstr[]){

inti;

unsignedintlen=0;

for(i=0;str[i]!='\0';i++) { len++; }

return(len);}unsignedintMyStrlen(char*pStr){

unsignedintlen=0;

for(;*pStr!='\0';pStr++) { len++; }

return(len);}方法2:用字符指針實(shí)現(xiàn)方法1:用字符數(shù)組實(shí)現(xiàn)例7.6:計(jì)算實(shí)際字符個數(shù)unsignedintM指針與數(shù)組數(shù)組名就是一個指針只是不能修改這個指針的指向可以定義函數(shù)的參數(shù)為數(shù)組指針也可當(dāng)作數(shù)組名使用short*p,a[10];

p=a;數(shù)組元素的幾種等價(jià)引用形式a[i]*(a+i)p[i]*(p+i)60006001600260036004600560066007a[0]a[1]a[2]a[3]aa+1a+260006001600260036004600560066007a[0]a[1]a[2]a[3]app++p++指針與數(shù)組數(shù)組名就是一個指針6000a[0]aa+1a+26輸入輸出數(shù)組的全部元素main(){

inta[10];

inti;

for(i=0;i<10;i++)scanf("%d",&a[i]);

for(i=0;i<10;i++)printf("%d",a[i]);}方法1:下標(biāo)法main(){

inta[10];

int*p,i;

for(p=a;p<(a+10);p++)scanf("%d",p);

for(p=a;p<(a+10);p++)printf("%d",*p);}方法2:指針法輸入輸出數(shù)組的全部元素main()方法1:下標(biāo)法main()例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動插入位置及其后的所有元素騰出這一位置放入待插入的元素13579a[0]a[1]a[2]a[3]a[4]a[5]插入位置pos

x=4x插入前:③

①134579

x插入后:插入元素xa[0]a[1]a[2]a[3]a[4]a[5]例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動例7.7:插入排序——主函數(shù)#include<stdio.h>#defineARR_SIZE10voidInseart(inta[],intn,intx)main()/*教材268頁*/{ inta[ARR_SIZE+1],x,i,n; …… ……

Inseart(a,n,x);/*調(diào)用函數(shù)實(shí)參a為數(shù)組名*/ ……}例7.7:插入排序——主函數(shù)#include<stdio例7.7:插入排序——數(shù)組作形參voidInseart(inta[],intn,intx){

inti,pos;

for(i=0;(i<n)&&(x>a[i]);i++) { } pos=i;

for(i=n-1;i>=pos;i--) { a[i+1]=a[i];/*向后移動*/ } a[pos]=x;/*插入元素x到位置pos*/}例7.7:插入排序——數(shù)組作形參voidInseartmain()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; …… ……

Inseart(a,n,x);/*調(diào)用函數(shù)實(shí)參a為數(shù)組名*/ ……}voidInseart(int*a,intn,intx)/*定義函數(shù),形參a為指針變量*/{ ……}插入排序——方式二main()/*教材270頁*/插main()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; int*p=NULL; …… ……

Inseart(p,n,x);/*調(diào)用函數(shù)實(shí)參p指針變量*/ ……}voidInseart(inta[],intn,intx)/*定義函數(shù),形參a為數(shù)組*/{ ……}插入排序——方式三main()/*教材270頁*/插main()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; int*p=NULL; …… ……

Inseart(p,n,x);/*調(diào)用函數(shù)實(shí)參p為指針變量*/ ……}voidInseart(int*a,intn,intx)/*定義函數(shù),形參a為指針變量*/{ ……}插入排序——方式4main()/*教材270頁*/插例7.7:插入排序——指針作形參voidInseart(int*a,intn,intx){

inti,pos;

for(i=0;(i<n)&&(x>*(a+i));i++) { } pos=i;

for(i=n-1;i>=pos;i--) { *(a+i+1)=*(a+i);/*向后移動*/ } *(a+pos)=x;/*插入元素x到位置pos*/}例7.7:插入排序——指針作形參voidInseart指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個數(shù)組元素又是一個一維數(shù)組按行順序存放所有元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]aa[0]+0a+1a[1]+0a[0]+1a[0]+2&a[0][0]&a[1][0]&a[1][1]a[1]+1&a[1][2]&a[0][1]&a[0][2]

a[0][0] a[0] a[0][1] a[0][2] a[1][0] a[1] a[1][1] a[1][2]

a

a[1]+2inta[2][3];指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個數(shù)組元素又例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)字。charweekDay[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};表7-1星期表的內(nèi)容0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdayweekDay[0]weekDay[1]weekDay[2]weekDay[3]weekDay[4]weekDay[5]weekDay[6]Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)#include<string.h>

main(){

inti,pos;

intfindFlag=0;

charx[10];

charweekDay[][10]={"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday","Saturday"}; printf("Pleaseenterastring:"); scanf("%s",x);

for(i=0;i<7&&!findFlag;i++) {

if(strcmp(x,weekDay[i])==0) { pos=i; findFlag=1; } }

if(findFlag) printf("%sis%d\n",x,pos);

else printf("Notfound!\n");}例7.8weekDay[0]weekDay[1]weekDay[2]weekDay[3]weekDay[4]weekDay[5]weekDay[6]Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0xSunday\0#include<string.h>例7.8weekD指針與二維數(shù)組a代表二維數(shù)組的首地址,第0行的地址a+i代表第i行的地址*(a+i)即a[i]代表第i行第0列的地址*(a+i)+j即a[i]+j代表第i行第j列的地址*(*(a+i)+j)即a[i][j]代表第i行第j列的元素行地址轉(zhuǎn)變成列地址指針與二維數(shù)組a行地址轉(zhuǎn)變成列地址指針與二維數(shù)組二維數(shù)組的指針——列指針 int*p; p=*a;//用列地址初始化逐個元素查找元素所在位置相對于數(shù)組起始地址的偏移量i*n+j for(i=0;i<m;i++)

for(j=0;j<n;j++) printf("%d",*(p+i*n+j));a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]pp++指針與二維數(shù)組二維數(shù)組的指針——列指針a[0][0]a[1]指針與二維數(shù)組二維數(shù)組的指針——行指針 int(*p)[3],a[4][3],*p1; p=a;//用行地址初始化

p1=a[0];//用元素地址初始化先逐行查找元素所在行再在行內(nèi)逐列查找元素所在位置 for(i=0;i<m;i++)

for(j=0;j<n;j++) printf("%d",*(*(p+i)+j));a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]pp++指針與二維數(shù)組二維數(shù)組的指針——行指針a[0][0]a[1]例7.3:在一個班級中找出最高分及其學(xué)號voidFindMax(floatscore[],longnum[],intn,floatpMaxScore,longpMaxNum){

inti; pMaxScore=score[0]; pMaxNum=num[0];

for(i=1;i<n;i++) {

if(score[i]>pMaxScore) { pMaxScore=score[i]; pMaxNum=num[i]; } }}能返回這兩個值嗎?例7.3:在一個班級中找出最高分及其學(xué)號voidFi例7.3:在一個班級中找出最高分及其學(xué)號voidFindMax(floatscore[],longnum[],intn,float*pMaxScore,long*pMaxNum){

inti; *pMaxScore=score[0]; *pMaxNum=num[0];

for(i=1;i<n;i++) {

if(score[i]>*pMaxScore) { *pMaxScore=score[i]; *pMaxNum=num[i]; } }}指針參數(shù)指定了存放這兩個值的地址例7.3:在一個班級中找出最高分及其學(xué)號voidFi例7.9:在多個班級中找出最高分及其所在班級和學(xué)號

intFindMax(int

p[m][n],intm,intn, int*pRow,int*pCol){

inti,j,max; max=p[0][0]; *pRow=0; *pCol=0;

for(i=0;i<m;i++) {

for(j=0;j<n;j++) {

if(p[i][j]>max){ max=p[i][j]; *pRow=i; *pCol=j;} } }

return(max);}能這樣傳遞m個班(每班n個學(xué)生)的成績嗎?例7.9:在多個班級中找出最高分及其所在班級和學(xué)號intintFindMax(int

*p,intm,intn,int*pRow,int*pCol){

inti,j,max; max=p[0]; *pRow=0; *pCol=0;

for(i=0;i<m;i++) {

for(j=0;j<n;j++) {

if(p[i*n+j]>max){ max=p[i*n+j]; *pRow=i; *pCol=j;} } }

return(max);}指定存儲m個班(每班n個學(xué)生)成績的首地址例7.9:在多個班級中找出最高分及其所在班級和學(xué)號

intFindMax(int*p,intm,in指針、數(shù)組以及其它的類型混合基本數(shù)據(jù)類型int、long、char、short、float、double……指針是一種數(shù)據(jù)類型是從其它類型派生的類型XX類型的指針數(shù)組也是一種數(shù)據(jù)類型是從其它類型派生的類型每個元素都有一個類型任何類型都可以做指針或者數(shù)組的基礎(chǔ)類型它們自己也可以做彼此或自己的基礎(chǔ)類型指針、數(shù)組以及其它的類型混合基本數(shù)據(jù)類型第7章指針

(一)C語言程序設(shè)計(jì)51第7章指針

(一)C語言程序設(shè)計(jì)1內(nèi)容提要指針概述 指針的概念為什么引入指針的概念指針變量作為函數(shù)參數(shù)字符指針作為函數(shù)參數(shù) 指針和數(shù)組間的關(guān)系一維數(shù)組的地址和指針二維數(shù)組的地址和指針內(nèi)容提要指針概述 為什么引入指針的概念鐵桿C/C++程序員最摯愛的武器:指針C/C++的高效、高能主要來自于指針很多不可能的任務(wù)由指針完成

為什么引入指針的概念鐵桿C/C++程序員最摯愛的武器:指針為什么引入指針的概念指針為函數(shù)提供修改變量值的手段

為C的動態(tài)內(nèi)存分配系統(tǒng)提供支持

為動態(tài)數(shù)據(jù)結(jié)構(gòu)(如例鏈表、隊(duì)列、二叉樹等)提供支持

可以改善某些子程序的效率

為什么引入指針的概念指針內(nèi)存的尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?通過變量的地址訪問變量所在的存儲單元兩種尋址方式直接(尋址)訪問通過變量地址直接存取變量內(nèi)容間接(尋址)訪問通過指針變量來間接存取它所指向的變量i_pointer=&i;內(nèi)存的尋址方式如何讀寫內(nèi)存中的數(shù)據(jù)?指針(Pointer)的概念指針也是一種數(shù)據(jù)類型指針變量聲明為指針類型的變量,專門存放地址數(shù)據(jù)的變量

指針(Pointer)的概念指針也是一種數(shù)據(jù)類型如何定義指針變量?定義指針變量int*p;定義了一個指針變量p,簡稱指針pp是變量,int*是類型指針變量初始化int*p,a;p=&a;*p與a完全等價(jià)如何定義指針變量?定義指針變量inti,*p;p=&i;

int*p;float*q;p=q;inti;float*p;p=&i;int*p;p=100;判斷是真?是假?指針變量只存放地址!一個指針變量不能指向與其類型不同的變量!我是真的,你猜對了嗎?應(yīng)在類型相同的指針變量之間賦值inti,*p;int*p;inti;int*p;&與*操作符&用來取變量的地址*用來取指針指向的內(nèi)存中的內(nèi)容int*p,a[10];

p=&a[0];*p=20;int*p,a[10];

p=&a[5];*p=20;inti=3,*p;

p=&i;printf(“*p=%d”,*p);int*p,a[10];

p=a;*p=20;等價(jià)于a[0]=20;&與*操作符&用來取變量的地址int*p,a[10];

指針變量與其它類型變量的對比共性在內(nèi)存中占據(jù)一定大小的存儲單元先定義,后使用特殊性

它的內(nèi)容只能是地址,而不能是數(shù)據(jù)必須初始化后才能使用,否則指向不確定的存儲單元,對該空間進(jìn)行訪問,將可能造成危險(xiǎn)可參與的運(yùn)算:加、減一個整數(shù),自增、自減、關(guān)系、賦值只能指向同一基類型的變量指針變量與其它類型變量的對比共性指針的指向只能指向同一基類型的變量,否則將引起warningfloatx;int*p=&x;TC編譯warning:SuspiciouspointerconversioninfunctionmainVC編譯warningC4133:'=':incompatibletypes-from'float*'to'int*'指針的指向只能指向同一基類型的變量,否則將引起warning指針運(yùn)算算術(shù)運(yùn)算short*p,a[10];p=a;p++;/*p的值增加多少?*/指針的加減運(yùn)算是以其指向的類型的字節(jié)長度為單位的6000600160026003600460056006p-1pp+1指針運(yùn)算算術(shù)運(yùn)算6000p-1pp+1指針運(yùn)算int*p,*q,a[10];

p=a;

q=&a[5];q-pq=p+5;指針運(yùn)算不能亂算一般只進(jìn)行指針和整數(shù)的加減運(yùn)算,同類型指針之間的減法運(yùn)算其它運(yùn)算,比如乘法、除法、浮點(diǎn)運(yùn)算、指針之間的加法等,并無意義,所以也不支持指針運(yùn)算int*p,*q,a[10];

p=a;

指針運(yùn)算關(guān)系運(yùn)算指向同一種數(shù)據(jù)類型的兩個指針才能進(jìn)行關(guān)系運(yùn)算值為1或0p>qp<qp==q不能與非指針類型變量進(jìn)行比較,但可與NULL(即0值)進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針P==NULLp!=NULL指針運(yùn)算關(guān)系運(yùn)算指針運(yùn)算賦值運(yùn)算指針在使用前一定要賦值為指針變量賦的值必須是一個地址main(){

int*p; scanf("%d",p);…}main(){

inta,*p=&a;scanf("%d",p);…}錯!但TC下不報(bào)錯VC下報(bào)錯指針運(yùn)算賦值運(yùn)算main()main()錯!指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)參數(shù)和返回值的類型指針做函數(shù)參數(shù)的經(jīng)典例子:兩數(shù)的互換指針與函數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)參數(shù)和返回值的類voidSwap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}main(){inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}

voidSwap(intx,inty){inttemp;temp=x;x=y;y=temp;}main(){inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}程序1程序2例7.1~7.2:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換主調(diào)函數(shù)被調(diào)函數(shù)實(shí)參形參結(jié)果有何不同?NotWork!Why?main()main()程序1程序2例7.1~7.2:主調(diào)函數(shù)被調(diào)函數(shù)main(){

inta,b;a=15;b=8;Swap(a,b);printf("a=%d,b=%d",a,b);}voidSwap(intx,inty){

inttemp;temp=x;x=y;y=temp;}55ab實(shí)參形參99xyab程序1xy55temp9主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(intx,主調(diào)函數(shù)被調(diào)函數(shù)main(){

inta,b;a=15;b=8;Swap(&a,&b);printf("a=%d,b=%d",a,b);}voidSwap(int*x,int*y){

inttemp;temp=*x;*x=*y;*y=temp;}&a&a實(shí)參形參&b&bxyab程序2xy5temp5ab995主調(diào)函數(shù)被調(diào)函數(shù)main()voidSwap(int*x簡單變量作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的比較1581581581515881581515a)調(diào)用Swap函數(shù)(b)執(zhí)行Swap函數(shù)c)從Swap函數(shù)返回tempxy

bmain函數(shù)Swap函數(shù)①②③aaatemptempxxy

ybb158815&a&b&a&b15(a)調(diào)用Swap函數(shù)

(b)執(zhí)行Swap函數(shù)

a

a

b

b

*x

*x

*y

*y

y

y

x

x

&a

&b

main函數(shù)

Swap函數(shù)temptemp②①③簡單變量作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的比較15815swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞voidSwap(intx,inty){

inttemp;temp=x;/*x,y為內(nèi)部變量*/x=y;y=temp;}swap函數(shù)的幾種錯誤形式(1/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞voidSwap(int*p1,int*p2){

int*p;p=p1;/*p1,p2為內(nèi)部變量*/p1=p2;p2=p;}swap函數(shù)的幾種錯誤形式(2/3)參數(shù)單向傳遞swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址voidSwap(int*p1,int*p2){

int*p;/*指針p未初始化*/*p=*p1;*p1=*p2;*p2=*p;}swap函數(shù)的幾種錯誤形式(3/3)指針p沒有確切地址字符串與字符數(shù)組、字符指針C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符串一串以'\0'結(jié)尾的字符字符數(shù)組每個元素都是字符類型的數(shù)組charstring[100];字符指針指向字符類型的指針char*p;數(shù)組和指針可以等同看待,上面三者本質(zhì)上是一回事字符串與字符數(shù)組、字符指針C語言并沒有為字符串提供任何專門的字符指針變量與字符數(shù)組的區(qū)別定義方法不同

charstr[10];

char*ptr;賦值方法不同

charstr[10];str=”china”;/*錯誤*/strcpy(str,”china”);/*正確*/

char*ptr;ptr=”china”;字符指針是變量,而數(shù)組名是地址常量字符指針變量與字符數(shù)組的區(qū)別定義方法不同使用字符指針的注意事項(xiàng)字符指針變量必須有明確的指向,否則使用是危險(xiǎn)的例如,輸入字符串時char*a;scanf("%s",a);/*錯誤*/

應(yīng)為:

char*a;

charstr[10];a=str;

scanf("%s",a);/*正確*/使用字符指針的注意事項(xiàng)字符指針變量必須有明確的指向,否則使用例7.5:字符串拷貝——用字符數(shù)組編程voidMyStrcpy(chardstStr[],charsrcStr[]){

inti=0;

while(srcStr[i]!='\0') { dstStr[i]=srcStr[i]; i++; } dstStr[i]='\0';}下標(biāo):01234567891011HelloChina\0HelloChina\0srcStr[i]dstStr[i]下標(biāo)移動方向dstStr[i]='\0'srcStrdstStr結(jié)束拷貝ii++

i

例7.5:字符串拷貝——用字符數(shù)組編程voidMyStvoidMyStrcpy(char*dstStr,constchar*srcStr){

while(*srcStr!='\0') { *dstStr=*srcStr; srcStr++; dstStr++; } *dstStr='\0';}當(dāng)只允許函數(shù)訪問地址內(nèi)容,不允許修改時,可以把函數(shù)的指針參數(shù)定義為constHelloChina\0HelloChina\0*srcStr*dstStr指針移動方向指針移動方向*to='\0'dstStrsrcStr++srcStrsrcStrdstStr++dstStr例7.5:字符串拷貝——用字符指針編程voidMyStrcpy(char*dstStr,c例7.5:字符串拷貝——主函數(shù)程序#include<stdio.h>main(){ chara[80],b[80]; printf(“Pleaseenterastring:”); gets(a);

MyStrcpy(b,a); printf(“Thecopyis:”); puts(b);}例7.5:字符串拷貝——主函數(shù)程序#include<st例7.6:計(jì)算實(shí)際字符個數(shù)unsignedintMyStrlen(charstr[]){

inti;

unsignedintlen=0;

for(i=0;str[i]!='\0';i++) { len++; }

return(len);}unsignedintMyStrlen(char*pStr){

unsignedintlen=0;

for(;*pStr!='\0';pStr++) { len++; }

return(len);}方法2:用字符指針實(shí)現(xiàn)方法1:用字符數(shù)組實(shí)現(xiàn)例7.6:計(jì)算實(shí)際字符個數(shù)unsignedintM指針與數(shù)組數(shù)組名就是一個指針只是不能修改這個指針的指向可以定義函數(shù)的參數(shù)為數(shù)組指針也可當(dāng)作數(shù)組名使用short*p,a[10];

p=a;數(shù)組元素的幾種等價(jià)引用形式a[i]*(a+i)p[i]*(p+i)60006001600260036004600560066007a[0]a[1]a[2]a[3]aa+1a+260006001600260036004600560066007a[0]a[1]a[2]a[3]app++p++指針與數(shù)組數(shù)組名就是一個指針6000a[0]aa+1a+26輸入輸出數(shù)組的全部元素main(){

inta[10];

inti;

for(i=0;i<10;i++)scanf("%d",&a[i]);

for(i=0;i<10;i++)printf("%d",a[i]);}方法1:下標(biāo)法main(){

inta[10];

int*p,i;

for(p=a;p<(a+10);p++)scanf("%d",p);

for(p=a;p<(a+10);p++)printf("%d",*p);}方法2:指針法輸入輸出數(shù)組的全部元素main()方法1:下標(biāo)法main()例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動插入位置及其后的所有元素騰出這一位置放入待插入的元素13579a[0]a[1]a[2]a[3]a[4]a[5]插入位置pos

x=4x插入前:③

①134579

x插入后:插入元素xa[0]a[1]a[2]a[3]a[4]a[5]例7.7:插入排序關(guān)鍵是:找到該插入的位置,然后依次移動例7.7:插入排序——主函數(shù)#include<stdio.h>#defineARR_SIZE10voidInseart(inta[],intn,intx)main()/*教材268頁*/{ inta[ARR_SIZE+1],x,i,n; …… ……

Inseart(a,n,x);/*調(diào)用函數(shù)實(shí)參a為數(shù)組名*/ ……}例7.7:插入排序——主函數(shù)#include<stdio例7.7:插入排序——數(shù)組作形參voidInseart(inta[],intn,intx){

inti,pos;

for(i=0;(i<n)&&(x>a[i]);i++) { } pos=i;

for(i=n-1;i>=pos;i--) { a[i+1]=a[i];/*向后移動*/ } a[pos]=x;/*插入元素x到位置pos*/}例7.7:插入排序——數(shù)組作形參voidInseartmain()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; …… ……

Inseart(a,n,x);/*調(diào)用函數(shù)實(shí)參a為數(shù)組名*/ ……}voidInseart(int*a,intn,intx)/*定義函數(shù),形參a為指針變量*/{ ……}插入排序——方式二main()/*教材270頁*/插main()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; int*p=NULL; …… ……

Inseart(p,n,x);/*調(diào)用函數(shù)實(shí)參p指針變量*/ ……}voidInseart(inta[],intn,intx)/*定義函數(shù),形參a為數(shù)組*/{ ……}插入排序——方式三main()/*教材270頁*/插main()/*教材270頁*/{ inta[ARR_SIZE+1],x,i,n; int*p=NULL; …… ……

Inseart(p,n,x);/*調(diào)用函數(shù)實(shí)參p為指針變量*/ ……}voidInseart(int*a,intn,intx)/*定義函數(shù),形參a為指針變量*/{ ……}插入排序——方式4main()/*教材270頁*/插例7.7:插入排序——指針作形參voidInseart(int*a,intn,intx){

inti,pos;

for(i=0;(i<n)&&(x>*(a+i));i++) { } pos=i;

for(i=n-1;i>=pos;i--) { *(a+i+1)=*(a+i);/*向后移動*/ } *(a+pos)=x;/*插入元素x到位置pos*/}例7.7:插入排序——指針作形參voidInseart指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個數(shù)組元素又是一個一維數(shù)組按行順序存放所有元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]aa[0]+0a+1a[1]+0a[0]+1a[0]+2&a[0][0]&a[1][0]&a[1][1]a[1]+1&a[1][2]&a[0][1]&a[0][2]

a[0][0] a[0] a[0][1] a[0][2] a[1][0] a[1] a[1][1] a[1][2]

a

a[1]+2inta[2][3];指針與二維數(shù)組C語言將二維數(shù)組看作一維數(shù)組,其每個數(shù)組元素又例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)字。charweekDay[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};表7-1星期表的內(nèi)容0Sunday1Monday2Tuesday3Wednesday4Thursday5Friday6SaturdayweekDay[0]weekDay[1]weekDay[2]weekDay[3]weekDay[4]weekDay[5]weekDay[6]Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0例7.8任意輸入英文的星期幾,在查找星期表后輸出其對應(yīng)的數(shù)#include<string.h>

main(){

inti,pos;

intfindFlag=0;

charx[10];

charweekDay[][10]={"Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday","Saturday"}; printf("Pleaseenterastring:"); scanf("%s",x);

for(i=0;i<7&&!findFlag;i++) {

if(strcmp(x,weekDay[i])==0) { pos=i; findFlag=1; } }

if(findFlag) printf("%sis%d\n",x,pos);

else printf("Notfound!\n");}例7.8weekDay[0]weekDay[1]weekDay[2]weekDay[3]weekDay[4]weekDay[5]weekDay[6]Sunday\0Monday\0Tuesday\0Wednesday\0Thursday\0Friday\0Saturday\0xSunday\0#include<string.h>例7.8weekD指針與二維數(shù)組a代表二維數(shù)組的首地址,第0

溫馨提示

  • 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

提交評論