




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
程序設計基礎(C)主講:王娟勤西北農林科技大學信息工程學院地址指針和指針變量5.1指針與一維數組5.2指針與二維數組5.3第5章指針指針與字符串5.4指針數組5.5
內存存放了計算機正在運行的程序和程序正在使用的數據。內存的基本單元是字節(Byte)。
為了訪問內存單元,CPU給每個內存單元一個編號,該編號稱為該內存單元的地址。
變量是程序中可以改變的量,當說明變量時,系統將為其在內存中開辟相應的內存單元。由此確定變量的地址及內存中的表示方式。2000H2001H2002H2003Hinta=0;a的內存單元a的地址&a
如果有一變量p,其內容存放了a的地址&a,通過p也可實現對a的訪問,p稱為指針變量。00H20Hp00005.1指針和指針變量變量與地址00H00H…...…...2000200820122010整型變量i10變量i_pointer200220042006指針與指針變量指針:就是地址指針變量:專門存放地址的變量叫~2000指針指針變量
變量的內容
變量的地址5.1指針和指針變量指針與指針變量指針:一個變量的地址指針變量:專門存放變量地址的變量叫~指針變量變量變量地址(指針)變量值指向地址存入指針變量5.1指針和指針變量&與*運算符含義含義:取變量的地址單目運算符優先級:2結合性:自右向左含義:
間接尋址運算符單目運算符優先級:2結合性:自右向左兩者關系:互為逆運算理解i_pointer-----指針變量,它的內容是地址*i_pointer----指針的目標變量,它的內容是數據&i_pointer---指針變量占用內存的地址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指針和指針變量指針變量指針變量的定義一般形式:
數據類型
*指針名;合法標識符指針的目標變量的數據類型表示定義指針變量不是‘*’運算符例int
*p1,*p2;float*q;char*name;注意:1、int*p1,*p2;與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時所規定類型的變量4、指針變量定義后,變量值不確定,應用前必須先賦值5.1指針和指針變量指針變量的初始化一般形式:數據類型
*指針名=初始地址值;例inti;int*p=&i;變量必須與已說明過的類型應一致例
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指針和指針變量指向數組元素的指針變量例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數組名是表示數組首地址的地址常量5.2指針與一維數組指針的運算指針變量的賦值運算p=&a;(將變量a地址p)p=array;(將數組array首地址p)p=&array[i];(將數組元素地址p)p1=p2;(指針變量p2值p1)不能把一個整數p,也不能把p的值整型變量如
inti,*p;p=1000;(
)i=p;(
)5.2指針與一維數組指針的算術運算:pipid(i為整型數,d為p指向的對象所占字節數)p++,p--,p+=i,p-=i等若p1與p2指向同一數組,p1-p2=兩指針間元素個數
(p1-p2)/dp1+p2無意義例p指向int數組,則p+1p+14例p指向int型數組,且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數組pp+1,a+1p+i,a+ip+9,a+915.2指針與一維數組指針變量的關系運算若p1和p2指向同一數組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數組,比較無意義5.2指針與一維數組數組元素表示方法[]下標運算符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指針與一維數組a[0]a[1]a[2]a[3]a[4]例數組元素的引用方法#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指針與一維數組例:通過指針求數組中所有元素的平均值。#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指針與一維數組例:用指針求數組中的最大值及其位置。#include<stdio.h>intmain(){inta[10],*p,*pMax;printf("Enter10integers:\n");
for(p=a;p<a+10;p++)scanf("%d",p);pMax=a;/*設下標為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指針與一維數組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指針變量可以指到數組后的內存單元5.2指針與一維數組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;}例逆置一維數組中的數據。p=a;q=a+6;pp58762730123456appqqq指針與一維數組q例對一維數組中的數據按由小到大的順序排序指針與一維數組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.查找:從鍵盤輸入一個數x,輸出x是否在該數組中,如在,輸出在數組中的位置,如不在,輸出“不存在”的信息。2.在上題的基礎上刪除查找到的數字。二維數組的地址對于一維數組:(1)數組名array表示數組的首地址,即array[0]的地址;(2)數組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]
*(array+i)arrayintarray[10];5.3指針與二維數組對于二維數組:(1)a是數組名,包含三個元素
a[0],a[1],a[2](2)每個元素a[i]
又是一個一維數組,包含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指針與二維數組對二維數組inta[3][4],有a-----二維數組的首地址,即第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指針與二維數組表示形式含義地址a二維數組名,數組首地址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指針與二維數組用指針訪問二維數組指向二維數組數組元素的指針變量例指向二維數組數組元素的指針變量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指針與二維數組例:定義一個三行四列的整型二維數組,輸入數據,求最小元素及位置。#include<stdio.h>intmain(){inta[3][4],*p; //定義整型指針pinti,j,*pmin; //pmin用來指向找到的最小元素p=&a[0][0]; //p指向了二維數組第一個元素
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指針與二維數組
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指針與二維數組行指針變量定義形式:數據類型(*指針名)[一維數組元素個數];
例int(*p)[4];()不能少int(*p)[4]與int*p[4]不同p是行指針可讓p指向二維數組某一行如
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)行指針變量“一維數組元素個數”和二維數組列數必須相同例行指針變量舉例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指針與二維數組例:輸入一個四行四列的矩陣,判斷其是否為對稱矩陣。#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++) //輸入數組元素的值for(j=0;j<4;j++)scanf("%d",*(p+i)+j);5.3指針與二維數組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指針與二維數組例二維數組與指針運算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;}運行結果:2,4,7,5,3123434565678pq2pqpq字符串表示形式用字符數組實現例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指針與字符串用字符指針實現例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指針與字符串字符指針變量與字符數組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指針與字符串字符指針變量與字符數組字符數組的各元素是可以修改的,但是字符指針指向的字符串常量是不能修改的。例如:charstr[]="House";char*p="House";str[2]='r'; //正確,字符數組的值可以修改。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;}【例】從鍵盤輸入一串字符,統計其中數字字符、字母和其他字符的個數。5.4指針與字符串if(*p>='0'&&*p<='9')cnt1++;elseif((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z'))cnt2++;elsecnt3++;練習:1.將給定的字符串復制到另一字符串。2.從鍵盤輸入一行字符串,把該字符串中的所有小寫字母變成大寫字母,輸出該字符串。3.從鍵盤輸入一個字符串,輸出該字符串的長度,不使用strlen()函數。用于處理二維數組或多個字符串指針數組定義形式:數據類型
*數組名[數組長度說明];例int*p[4];指針所指向變量的數據類型區分int*p[4]與int(*p)[4]5.5指針數組指針數組的應用1.用指針數組訪問二維數組
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指針數組例:利用指針數組輸出二維數組中的元素.#include<stdio.h>intmain(){inti,j;inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int*p[3]; //定義指針數組
p[0]=a[0];p[1]=a[1];p[2]=a[2]; //指針數組賦初值for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%5d",*(p[i]+j));
printf("\n");}return0;}5.5指針數組2.指針數組指向多個字符串常量初始化:intmain(){char*p[]={"Fortran","Lisp","Basic"};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]5.5指針數組
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二維數組與指針數組區別:例:輸入0到6的數字,分別代表周日到周六,輸出對應的英文名稱。#include<stdio.h>intmain(void){char*strDay[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};intday;scanf("%d",&day); //讀入整數if(day>=0&&day<=6)puts(strDay[day]); elseputs("InputError!");return0;}5.5指針數組#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指針數組
解題思路:定義一個能存放5個字符串的二維字符型數組cty[5][80],再定義一個指向cty的字符型指針數組str[5],使其每個元素指向一個字符串,并從鍵盤輸入這些字符串存入字符型數組。在選擇排序中,通過指針將每個字符串作為一個整體進行比較,在需要交換時,只交換指針數組元素的指向,并不交換數組中的字符。排序完成后,按指針數組元素的順序輸出各個字符串。【例】用選擇法對給定的5個字符串按從小到大的順序排序。3.用指針數組實現字符串排序5.5指針數組#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("升序排序結果:\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("升序排序結果:\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("升序排序結果:\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("升序排序結果:\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("升序排序結果:\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("升序排序結果:\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("升序排序結果:\n");for(i=0;i<5;i++)printf("%s\n",str[i]);return0;}strstrstrstrstrstrstrstrstrstr字符串按字典順序排序—二維數組編程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函數指針:函數在編譯時被分配的入口地址,用函數名表示max…...指令1指令2函數指針變量賦值:如p=max;函數返回值的數據類型專門存放函數入口地址可指向返回值類型相同的不同函數指向函數的指針變量定義形式:數據類型(*指針變量名)();如int(*p)();函數指針變量指向的函數必須有函數說明函數調用形式:c=max(a,b);c=(*p)(a,b);c=p(a,b);對函數指針變量pn,p++,p--無意義()不能省int(*p)()與int*p()不同5.6函數指針例用函數指針變量調用函數,比較兩個數大小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(整型變量)一級指針單級間接尋址二級指針一級指針目標變量二級間接尋址定義形式:[存儲類型]
數據類型**指針名;如char**p;例inti,**p;p=&i;(
)//p是二級指針,不能用變量地址為其賦值指針本身的存儲類型最終目標變量的數據類型*p是p間接指向對象的地址**p是p間接指向對象的值例inti=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運行結果:644:goodbye用*p可輸出地址(%o或%x),也可用它輸出字符串(%s)p
*(p++)5.7多級指針(指向指針的指針)二級指針與指針數組的關系
int**p與int*q[10]指針數組名是二級指針常量p=q;p+i是q[i]的地址指針數組作形參,int*q[]與int**q完全等價;但作為數組和變量定義兩者不同系統只給p分配能保存一個指針值的內存區;而給q分配10塊內存區,每塊可保存一個指針值5.7多級指針(指向指針的指針)零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:int*p=0;
p指向地址為0的單元,系統保證該單元不作它用表示指針變量值沒有意義#defineNULL0int*p=NULL:p=NULL與未對p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態比較
例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時要進行強制類型轉換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數據的指針變量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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司組織業余活動方案
- 公司組合活動策劃方案
- 公司活動宣傳策劃方案
- 2025年心理學研究生入學考試試卷及答案
- 2025年全球化與國際關系研究生入學考試題及答案
- 2025年科學傳播專業研究生入學考試試題及答案
- 2025年礦業工程與安全管理考試題及答案
- 2025年翻譯與口譯專業資格考試試卷及答案
- 2024年度浙江省護師類之主管護師考前沖刺試卷B卷含答案
- 2024年度浙江省二級造價工程師之建設工程造價管理基礎知識模擬預測參考題庫及答案
- 高等職業學校礦物加工技術專業 實訓教學條件建設標準
- 建設單位質量安全保證體系
- 小學生反洗錢知識講座
- 養殖業技術知識培訓課件
- 慢性傷口護理中的柔性可穿戴設備應用
- 業務部門協作與協同計劃
- 2025年陜西省公民科學素質大賽考試題(附答案)
- 2025年蘭州石化職業技術大學單招職業技能測試題庫帶答案
- 教學課件-金融學概論(第2版-蓋銳)
- 人為關懷在骨科護理中的應用
- 人工智能算法模型定制開發合同
評論
0/150
提交評論