




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
程序設(shè)計基礎(chǔ)(C)主講:王娟勤西北農(nóng)林科技大學信息工程學院地址指針和指針變量5.1指針與一維數(shù)組5.2指針與二維數(shù)組5.3第5章指針指針與字符串5.4指針數(shù)組5.5
內(nèi)存存放了計算機正在運行的程序和程序正在使用的數(shù)據(jù)。內(nèi)存的基本單元是字節(jié)(Byte)。
為了訪問內(nèi)存單元,CPU給每個內(nèi)存單元一個編號,該編號稱為該內(nèi)存單元的地址。
變量是程序中可以改變的量,當說明變量時,系統(tǒng)將為其在內(nèi)存中開辟相應(yīng)的內(nèi)存單元。由此確定變量的地址及內(nèi)存中的表示方式。2000H2001H2002H2003Hinta=0;a的內(nèi)存單元a的地址&a
如果有一變量p,其內(nèi)容存放了a的地址&a,通過p也可實現(xiàn)對a的訪問,p稱為指針變量。00H20Hp00005.1指針和指針變量變量與地址00H00H…...…...2000200820122010整型變量i10變量i_pointer200220042006指針與指針變量指針:就是地址指針變量:專門存放地址的變量叫~2000指針指針變量
變量的內(nèi)容
變量的地址5.1指針和指針變量指針與指針變量指針:一個變量的地址指針變量:專門存放變量地址的變量叫~指針變量變量變量地址(指針)變量值指向地址存入指針變量5.1指針和指針變量&與*運算符含義含義:取變量的地址單目運算符優(yōu)先級:2結(jié)合性:自右向左含義:
間接尋址運算符單目運算符優(yōu)先級:2結(jié)合性:自右向左兩者關(guān)系:互為逆運算理解i_pointer-----指針變量,它的內(nèi)容是地址*i_pointer----指針的目標變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointerii_pointer&i&(*i_pointer)i*i_pointer*(&i)i_pointer
=
&i
=
&(*i_pointer)i
=*i_pointer=
*(&i)inti=10,j;int*i_pointer;i_pointer=&i;*i_pointer=20;j=*i_pointer;200020i_pointer*i_pointeri5.1指針和指針變量指針變量…...…...2000200820122010整型變量i10變量i_pointer2002200420062000直接訪問與間接訪問直接訪問:用變量名存取變量值間接訪問:通過存放變量地址的變量去訪問變量例
i=3;-----直接訪問3例*i_pointer=20;-----間接訪問205.1指針和指針變量指針變量指針變量的定義一般形式:
數(shù)據(jù)類型
*指針名;合法標識符指針的目標變量的數(shù)據(jù)類型表示定義指針變量不是‘*’運算符例int
*p1,*p2;float*q;char*name;注意:1、int*p1,*p2;與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值5.1指針和指針變量指針變量的初始化一般形式:數(shù)據(jù)類型
*指針名=初始地址值;例inti;int*p=&i;變量必須與已說明過的類型應(yīng)一致例
int*p=&i;
inti;例inti;int*p=&i;int*q=p;用已初始化指針變量作初值5.1指針和指針變量例int
main(){inti=10;int*p;*p=i;printf("%d",*p);return0;}危險!例
int
main(){inti=10,k;int*p;p=&k;*p=i;printf("%d",*p);return0;}指針變量必須先賦值,再使用…...…...2000200820122010整型變量i10指針變量p200220042006隨機5.1指針和指針變量inta=20,b=15,c;int*p1=&a,*p2=&b;int*p3;p3=p2,p2=p1,p1=p3;c=*p2,*p2=*p1,*p1=c;2015ab2015abp1p22015abp2p11520abp2p15.1指針和指針變量指向數(shù)組元素的指針變量例intarray[10];int*p;p=&array[0];//
p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p數(shù)組名是表示數(shù)組首地址的地址常量5.2指針與一維數(shù)組指針的運算指針變量的賦值運算p=&a;(將變量a地址p)p=array;(將數(shù)組array首地址p)p=&array[i];(將數(shù)組元素地址p)p1=p2;(指針變量p2值p1)不能把一個整數(shù)p,也不能把p的值整型變量如
inti,*p;p=1000;(
)i=p;(
)5.2指針與一維數(shù)組指針的算術(shù)運算:pipid(i為整型數(shù),d為p指向的對象所占字節(jié)數(shù))p++,p--,p+=i,p-=i等若p1與p2指向同一數(shù)組,p1-p2=兩指針間元素個數(shù)
(p1-p2)/dp1+p2無意義例p指向int數(shù)組,則p+1p+14例p指向int型數(shù)組,且p=&a[0];
則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組pp+1,a+1p+i,a+ip+9,a+915.2指針與一維數(shù)組指針變量的關(guān)系運算若p1和p2指向同一數(shù)組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數(shù)組,比較無意義5.2指針與一維數(shù)組數(shù)組元素表示方法[]下標運算符a[i]
*(a+i)a[i]
p[i]
*(p+i)
*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]aa+9a+1a+2地址元素下標法a[0]a[1]a[2]a[9]......a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針法*p*(p+1)*(p+2)*(p+9)......5.2指針與一維數(shù)組a[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引用方法#include<stdio.h>intmain(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;
pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);return0;}12345pa5.2指針與一維數(shù)組例:通過指針求數(shù)組中所有元素的平均值。#include<stdio.h>intmain(){inta[10],i;floatsum=0;printf("Enter10integers:\n");for(i=0;i<10;i++){scanf("%d",a+i);//a+i和&a[i]是等價的
sum+=*(a+i);//*(a+i)和a[i]是等價的
}printf("Theaverageofthe10integersis:%f\n",sum/10);return0;}5.2指針與一維數(shù)組例:用指針求數(shù)組中的最大值及其位置。#include<stdio.h>intmain(){inta[10],*p,*pMax;printf("Enter10integers:\n");
for(p=a;p<a+10;p++)scanf("%d",p);pMax=a;/*設(shè)下標為0的元素為最大值*/p=a+1;for(;p<a+10;p++){if(*p>*pMax)pMax=p;/*pMax保存最大元素的地址*/}printf("Themaxis%d\n",*pMax);printf("ThepositionofMaxis%d\n",pMax-a);return0;}5.2指針與一維數(shù)組intmain(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);return0;}例注意指針的當前值p=a;pp58762730123456apppppp指針變量可以指到數(shù)組后的內(nèi)存單元5.2指針與一維數(shù)組intmain(){intt,*p,*q,a[7];for(p=a;p<a+7;p++)scanf("%d",p);
for(;p<q;p++,q--){t=*p;*p=*q;*q=t;}……return0;}例逆置一維數(shù)組中的數(shù)據(jù)。p=a;q=a+6;pp58762730123456appqqq指針與一維數(shù)組q例對一維數(shù)組中的數(shù)據(jù)按由小到大的順序排序指針與一維數(shù)組qp58762730123456aqqqqqintmain(){intt,*p,*q,a[7];for(p=a;p<a+7;p++)scanf("%d",p);for(p=a;p<a+6;p++)for(q=p+1;q<a+7;q++)if(*p>*q){t=*p;*p=*q;*q=t;}……return0;}練習:1.查找:從鍵盤輸入一個數(shù)x,輸出x是否在該數(shù)組中,如在,輸出在數(shù)組中的位置,如不在,輸出“不存在”的信息。2.在上題的基礎(chǔ)上刪除查找到的數(shù)字。二維數(shù)組的地址對于一維數(shù)組:(1)數(shù)組名array表示數(shù)組的首地址,即array[0]的地址;(2)數(shù)組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]
*(array+i)arrayintarray[10];5.3指針與二維數(shù)組對于二維數(shù)組:(1)a是數(shù)組名,包含三個元素
a[0],a[1],a[2](2)每個元素a[i]
又是一個一維數(shù)組,包含4個元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020162032200020042016202020322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]行指針與列指針a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+15.3指針與二維數(shù)組對二維數(shù)組inta[3][4],有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)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i
&a[i],表示第i行首地址,指向行a[i]
*(a+i)
&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020162032200020042016202020322036a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+25.3指針與二維數(shù)組表示形式含義地址a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),*a第0行第0列元素地址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列元素值20002000201620162024135.3指針與二維數(shù)組用指針訪問二維數(shù)組指向二維數(shù)組數(shù)組元素的指針變量例指向二維數(shù)組數(shù)組元素的指針變量intmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int*p;for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n");printf("%4d",*p);}return0;}p=*a;p=&a[0][0];p=*(a+0);inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]p5.3指針與二維數(shù)組例:定義一個三行四列的整型二維數(shù)組,輸入數(shù)據(jù),求最小元素及位置。#include<stdio.h>intmain(){inta[3][4],*p; //定義整型指針pinti,j,*pmin; //pmin用來指向找到的最小元素p=&a[0][0]; //p指向了二維數(shù)組第一個元素
printf("Enterthearray:\n");for(i=0;i<3;i++)for(j=0;j<4;j++)scanf("%d",p+4*i+j); //輸入第i行第j列的元素5.3指針與二維數(shù)組
pmin=&a[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(*(p+4*i+j)<*pmin)pmin=p+4*i+j; printf("Theminvalis%d.\n",*pmin); //輸出最小元素
printf("Theminvalisatrow%dcol%d.\n",(pmin-&a[0][0])/4,(pmin-&a[0][0])%4);return0;}5.3指針與二維數(shù)組行指針變量定義形式:數(shù)據(jù)類型(*指針名)[一維數(shù)組元素個數(shù)];
例int(*p)[4];()不能少int(*p)[4]與int*p[4]不同p是行指針可讓p指向二維數(shù)組某一行如
inta[3][4],(*p)[4]=a;inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2pp+1p+2p[0]+1或*p+1p[1]+2或*(p+1)+2*(*p+1)或(*p)[1]
*(*(p+1)+2)行指針變量“一維數(shù)組元素個數(shù)”和二維數(shù)組列數(shù)必須相同例行指針變量舉例main(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
inti,j,(*p)[4];for(p=a,i=0;i<3;i++,p++){for(j=0;j<4;j++)printf("%d",*(*p+j));printf("\n");}}inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]ppp
p[0][j]intmain(){inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
inti,j,(*p)[4];for(p=a,i=0;i<3;i++){for(j=0;j<4;j++)printf("%d",*(*(p+i)+j));printf("\n");}return0;}5.3指針與二維數(shù)組例:輸入一個四行四列的矩陣,判斷其是否為對稱矩陣。#include<stdio.h>intmain(){inta[4][4];
int(*p)[4];inti,j,flag=1;
p=a; //為行指針p賦初值printf("Enterarrayelements:\n");for(i=0;i<4;i++) //輸入數(shù)組元素的值for(j=0;j<4;j++)scanf("%d",*(p+i)+j);5.3指針與二維數(shù)組for(i=0;i<4;i++)for(j=0;j<i;j++)if(p[i][j]!=p[j][i]) {flag=0;break;}if(flag)printf("Yes!"); //是對稱矩陣,打印Yeselseprintf("No!"); //不是對稱矩陣,打印Noreturn0;}5.3指針與二維數(shù)組例二維數(shù)組與指針運算intmain(){inta[3][4]={{1,2,3,4},{3,4,5,6},{5,6,7,8}};inti;int(*p)[4]=a,*q=a[0];for(i=0;i<3;i++){if(i==0) (*p)[i+i/2]=*q+1;else p++,++q;}for(i=0;i<3;i++)printf("%d,",a[i][i]);printf("%d,%d\n",*(*p),*q);return0;}運行結(jié)果:2,4,7,5,3123434565678pq2pqpq字符串表示形式用字符數(shù)組實現(xiàn)例int
main(){charstring[]="IloveChina!";printf("%s\n",string);printf("%s\n",string+7);return0;}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\05.4指針與字符串用字符指針實現(xiàn)例intmain(){char*string="IloveChina!";printf("%s\n",string);string+=7;while(*string){putchar(*string);string++;}return0;}IloveChistringn!a\0字符指針初始化:把字符串首地址賦給stringchar*string;string="IloveChina!";string*string!='\0'5.4指針與字符串字符指針變量與字符數(shù)組char*cp;與
charstr[20];str由若干元素組成,每個元素放一個字符;
而cp中存放字符串首地址
charstr[20];str="IloveChina!";(
)char*cp;cp="IloveChina!";(
)str是地址常量;cp是地址變量cp接受鍵入字符串時,必須先開辟存儲空間例charstr[10];scanf("%s",str);(
)而char*cp;scanf("%s",cp);(
)改為:char*cp,str[10];cp=str;scanf("%s",cp);(
)5.4指針與字符串字符指針變量與字符數(shù)組字符數(shù)組的各元素是可以修改的,但是字符指針指向的字符串常量是不能修改的。例如:charstr[]="House";char*p="House";str[2]='r'; //正確,字符數(shù)組的值可以修改。p[2]='r'; //錯誤,不能修改字符串常量。所以,指向字符串的指針既不能用于輸入,也不能對其間接運算表達式賦值。5.4指針與字符串#include<stdio.h>intmain(){charstr[100];char*p;intcnt1,cnt2,cnt3;puts("Enterastring:");gets(str);
cnt1=cnt2=cnt3=0;
p=str;while(*p!='\0'){
p++;}//用指針p訪問字符串中的每個字符printf("digit:%d\n",cnt1);printf("letter:%d\n",cnt2);printf("other:%d\n",cnt3);return0;}【例】從鍵盤輸入一串字符,統(tǒng)計其中數(shù)字字符、字母和其他字符的個數(shù)。5.4指針與字符串if(*p>='0'&&*p<='9')cnt1++;elseif((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z'))cnt2++;elsecnt3++;練習:1.將給定的字符串復(fù)制到另一字符串。2.從鍵盤輸入一行字符串,把該字符串中的所有小寫字母變成大寫字母,輸出該字符串。3.從鍵盤輸入一個字符串,輸出該字符串的長度,不使用strlen()函數(shù)。用于處理二維數(shù)組或多個字符串指針數(shù)組定義形式:數(shù)據(jù)類型
*數(shù)組名[數(shù)組長度說明];例int*p[4];指針所指向變量的數(shù)據(jù)類型區(qū)分int*p[4]與int(*p)[4]5.5指針數(shù)組指針數(shù)組的應(yīng)用1.用指針數(shù)組訪問二維數(shù)組
inta[3][4],*p[3]={a[0],a[1],a[2]};↓p[i]+0↓p[i]+1↓p[i]+2↓p[i]+3p[0]→a[0][0]a[0][1]a[0][2]a[0][3]p[1]→a[1][0]a[1][1]a[1][2]a[1[3]p[2]→a[2][0]a[2][1]a[2][2]a[2][3]5.5指針數(shù)組例:利用指針數(shù)組輸出二維數(shù)組中的元素.#include<stdio.h>intmain(){inti,j;inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int*p[3]; //定義指針數(shù)組
p[0]=a[0];p[1]=a[1];p[2]=a[2]; //指針數(shù)組賦初值for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(p[i]+j));
printf("\n");}return0;}5.5指針數(shù)組2.指針數(shù)組指向多個字符串常量初始化:intmain(){char*p[]={"Fortran","Lisp","Basic"};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]5.5指針數(shù)組
charname[5][9]={"gain","much","stronger","point","bye"};
char*name[5]={"gain","much","stronger","point","bye"};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二維數(shù)組與指針數(shù)組區(qū)別:例:輸入0到6的數(shù)字,分別代表周日到周六,輸出對應(yīng)的英文名稱。#include<stdio.h>intmain(void){char*strDay[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};intday;scanf("%d",&day); //讀入整數(shù)if(day>=0&&day<=6)puts(strDay[day]); elseputs("InputError!");return0;}5.5指針數(shù)組#include<stdio.h>intmain(){char*str[11]={"Icon","saw","memory","array","across","furcate","hypercube","independent","incurvate","indeterminate","indifferent"};chars[12];inti;for(i=0;i<11;i++)s[i]=str[i][i];s[i]='\0';printf("%s\n",s);return0;}【例】指定N個字符串,順序從各個字符串中取出第1、第2、……、第N個字符,形成一個新的字符串。5.5指針數(shù)組
解題思路:定義一個能存放5個字符串的二維字符型數(shù)組cty[5][80],再定義一個指向cty的字符型指針數(shù)組str[5],使其每個元素指向一個字符串,并從鍵盤輸入這些字符串存入字符型數(shù)組。在選擇排序中,通過指針將每個字符串作為一個整體進行比較,在需要交換時,只交換指針數(shù)組元素的指向,并不交換數(shù)組中的字符。排序完成后,按指針數(shù)組元素的順序輸出各個字符串?!纠坑眠x擇法對給定的5個字符串按從小到大的順序排序。3.用指針數(shù)組實現(xiàn)字符串排序5.5指針數(shù)組#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrstrstrstrstrstr#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkjjji=0
#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkjji=1
#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkjkji=2#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrkji=3#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstri=3
#include<stdio.h>#include<string.h>intmain(){charcty[5][80],*str[5],*temp;inti,j,k;for(i=0;i<5;i++)str[i]=cty[i];for(i=0;i<5;i++)gets(cty[i]);
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(strcmp(str[k],str[j])>0)k=j;temp=str[k];str[k]=str[i];str[i]=temp;
}printf("升序排序結(jié)果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrstrstrstrstrstr字符串按字典順序排序—二維數(shù)組編程char
str[N][10]={"Pascal","Basic","Fortran","Java","VisualC"},temp[10];
for(i=0;i<N-1;i++) {k=i; for(j=i+1;j<N;j++)
if(strcmp(str[j],str[k])<0) k=j;if(k!=i) {strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp); }}strstrstrstrstrstrstrstrstrstr函數(shù)指針:函數(shù)在編譯時被分配的入口地址,用函數(shù)名表示max…...指令1指令2函數(shù)指針變量賦值:如p=max;函數(shù)返回值的數(shù)據(jù)類型專門存放函數(shù)入口地址可指向返回值類型相同的不同函數(shù)指向函數(shù)的指針變量定義形式:數(shù)據(jù)類型(*指針變量名)();如int(*p)();函數(shù)指針變量指向的函數(shù)必須有函數(shù)說明函數(shù)調(diào)用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);對函數(shù)指針變量pn,p++,p--無意義()不能省int(*p)()與int*p()不同5.6函數(shù)指針例用函數(shù)指針變量調(diào)用函數(shù),比較兩個數(shù)大小intmain(){intmax(int,int);inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);return0;}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){intmax(int,int),(*p)();inta,b,c;
p=max;scanf("%d,%d",&a,&b);c=(*p)(a,b);//或者c=p(a,b);printf("a=%d,b=%d,max=%d\n",a,b,c);return0;}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}5.7多級指針(指向指針的指針)定義:指向指針的指針一級指針:指針變量中存放目標變量的地址p2&p1&i3p1(指針變量)i(整型變量)例int**p2;
int*p1;inti=3;p1=&i;p2=&p1;**p2=5;二級指針:指針變量中存放一級指針變量的地址例int*p;
inti=3;p=&i;*p=5;&i3p(指針變量)i(整型變量)一級指針單級間接尋址二級指針一級指針目標變量二級間接尋址定義形式:[存儲類型]
數(shù)據(jù)類型**指針名;如char**p;例inti,**p;p=&i;(
)//p是二級指針,不能用變量地址為其賦值指針本身的存儲類型最終目標變量的數(shù)據(jù)類型*p是p間接指向?qū)ο蟮牡刂?*p是p間接指向?qū)ο蟮闹道齣nti=3;
int*p1;
int**p2;p1=&i;p2=&p1;**p2=5;ip1p23&i&p1**p2,*p1*p2多級指針例三級指針int***p;
四級指針char****p;5.7多級指針(指向指針的指針)例用二級指針處理字符串#defineNULL0intmain(){
char**p;char*name[]={"hello","good","world","bye",""};
p=name+1;printf("%o:%s",*p,*p);p+=2;while(**p!=NULL)printf("%s\n",*p++);return0;}name[0]name[1]name[2]name[3]name[4]char*name[5]worldbye\0hellogoodnamep運行結(jié)果:644:goodbye用*p可輸出地址(%o或%x),也可用它輸出字符串(%s)p
*(p++)5.7多級指針(指向指針的指針)二級指針與指針數(shù)組的關(guān)系
int**p與int*q[10]指針數(shù)組名是二級指針常量p=q;p+i是q[i]的地址指針數(shù)組作形參,int*q[]與int**q完全等價;但作為數(shù)組和變量定義兩者不同系統(tǒng)只給p分配能保存一個指針值的內(nèi)存區(qū);而給q分配10塊內(nèi)存區(qū),每塊可保存一個指針值5.7多級指針(指向指針的指針)零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:int*p=0;
p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態(tài)比較
例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時要進行強制類型轉(zhuǎn)換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量5.7多級指針(指向指針的指針)例下列定義的含義(1)int*p[3];(2)int(*p)[3];(3)int*p();(4)int(*p)();(5)int*(*p)();(6)int(*p[3])();
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學語音知識題庫及答案
- 2025年向量題型歸納及題庫答案
- 遇見最好的自己演講稿
- 2025年麥田格文學考試題及答案
- 2025年湖南中考語文試卷及答案
- 個人自媒體創(chuàng)業(yè)方案咨詢
- 豐田活動策劃方案
- 高一下學期金太陽試卷及答案
- 西藏山南地區(qū)貢嘎縣2025年中考數(shù)學最后沖刺模擬試卷含解析
- 2025年學潛水理論考試題及答案
- 發(fā)育生物學實驗教案
- 低壓電工試題庫-含答案
- 【幼兒自主游戲中科學探究活動實踐研究文獻綜述1900字】
- 肝膿腫的診斷和治療
- YY 9706.102-2021醫(yī)用電氣設(shè)備第1-2部分:基本安全和基本性能的通用要求并列標準:電磁兼容要求和試驗
- GB 7691-2003涂裝作業(yè)安全規(guī)程安全管理通則
- 危險化學品雙重預(yù)防機制培訓(xùn)課件
- 跌倒墜床原因分析預(yù)防措施
- 湖南人民出版社乘槎筆記(斌椿)
- Q∕SY 1452.1-2012 石油裝備產(chǎn)品包裝規(guī)范 第1部分:鉆機和修井機
- 婦產(chǎn)科產(chǎn)前診斷技術(shù)服務(wù)臨床醫(yī)師考核題(附答案)
評論
0/150
提交評論