5.1 單項選擇題
1.設(shè)有定義“int a=3, b,*p=&a;”,則下列語句中使 b不為3的語句是( )
① b=* &a; ② b=* p;
③ b=a; ④ b=*a;
【解】定義有 int a=3, b,*p=&a;對b賦值的表達式有*&a、*p、a 、*a。引用變量。的值有兩種方法,一是直接引用a,二是通過a的指針間接引用a。對于后者,又有多種表達方法,通過指向a的指針p,間接引用a的內(nèi)容,如*p?;蛲ㄟ^求地址運算符由變量a得到其指針&a,再由這指針表達式間接引用 a的內(nèi)容,如* &a。所以表達式*&a、*p和a都能引用變量a的值,而使b的值為3。而表達式。a是錯誤的,因為a不是指針變量,不能對它施行取內(nèi)容運算符。。所以解答是④。
2 .設(shè)指針x指向的整型變量值為25,則"printf("%d\n",++ *x);"的輸出是( )
① 23 ② 24 ③ 25 ④ 26
【解】若指針變量x指向某個變量,例如指向變量v,并且變量v的值是25,則表達式++ *x的值是26。這是因為表達式的計算順序可加圓括號表達成(++(*x)),首先是*x,是對X所指變量V的引用,所以++ *X就是++V。++V是先讓變量V增1,并以增至后的V的值為表達式++V的結(jié)果,所以其值是 26。所以解答是④。
3.若有說明:“ int i,j= 7,*p=&i;”,則與“ i=j;”等價的語句是( )
①i=*p; ②*P=* &j;
③i==&j; ④i=* *p;
【解】指針變量 p指向變量i時,表達式i=*p等價于 i=i;表達式*p=*&j等價于i=j;而表達式i=&j企圖將整型變量的指針賦給整型變量,這是錯誤的;表達式i=* *p也是一種錯誤的表達式。p是指針,*p是p所指變量j,* *p是企圖將整型變量j當作指針,并想通過j間接引用某個變量。所以解答是②。
4.若有說明語句“int a[10],*p=a;”,對數(shù)組元素的正確引用是( )
①a[p] ②P[a]
③*(P+2) ④P+2
【解】在 C語言中,約定數(shù)組名單獨出現(xiàn)在表達式中時,它表示數(shù)組首元素的指針。有int a[10] ,則a可以作為&a[0]使用。另有整型指針變量p,代碼p=a實現(xiàn)p指向數(shù)組a的首元素。則表達式*(p+2)是引用數(shù)組元素a[2]。表達式a[p]和p[a]都是不正確的,下標必須是整型表達式,不可以是指針表達式。表達式p+2是指針表達式,它的值是&p[2]。所以只有表達式*(p+2)引用數(shù)組a的元素a[2]。所以解答是③。
5.下面各語句中,能正確進行賦字符串操作的語句是( )
①char s[5] ={"ABCDE"}; ②char s[5] ={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘};
③ char *s;s="ABCDE"; ④ char *s;scanf("%s", &s);
【解】字符串最終存儲于字符數(shù)組中,存儲字符串的字符數(shù)組可以是程序主動引入的(定義或動態(tài)分配),也可以是字符串常量,由系統(tǒng)分配。其中字符數(shù)組用字符串初始化就是字符串存儲于由程序引入的字符數(shù)組的例子。給字符指針賦字符串則是系統(tǒng)自動分配字符率存儲空間的例子。給字符指針賦字符串并不是將一個長長的字符串存于字符指針變量中,而是將字符串常量存儲于常量區(qū),并將存儲這個字符串的首字節(jié)地址賦給指針變量,讓指針變量指向字符率常量的首字符。對于以字符串作為字符數(shù)組初值的情況,要求字符數(shù)組足夠的大,能存得下字符串常量。這里有一個特別的規(guī)定,若數(shù)組的大小少于存儲字符串有效字符的字節(jié)個數(shù),系統(tǒng)將報告錯誤;當字符數(shù)組的大小只能存儲字符串的有效字符,而不能存儲字符率結(jié)束標記符時,則存儲于字符數(shù)組中的內(nèi)容是字符序列,因沒有存儲字符率結(jié)束標記符,存儲的內(nèi)容就不是字符串。如代碼char a[5]="ABCDE"。另外,給字符數(shù)組元素逐一賦字符初值,并在字符初值中沒有字符串結(jié)束標記符,則存于字符數(shù)組中的內(nèi)容也不是字符串。如代碼 char s[5]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘}。特別要注意當字符指針還未指向某個字符數(shù)組的元素時,不可以通過字符指針輸入字符串。如代碼char *s;scanf("%s",s)。若寫成char *str;scanf("%s",&str)更是錯誤的了。由于C語言規(guī)定數(shù)組不能相互賦值,所以只能將字符串常量賦給某字符指針。如代碼char *s;s="ABCDE"是正確的。實際上,字符率"ABCDE" 被存儲于常量區(qū)中,向指針變量賦的是字符指針,讓s指向其中的字符‘A‘。所以解答是③。
6.若有以下定義,則不能表示a數(shù)組元素的表達式是()
int a[10]={1,2,3,4,5,6,7,8,9,1o},*p=a;
①*p ② a[10] ③*a ④ a[p-a]
【解】上述代碼定義了有10個元素的整型數(shù)組。,和定義指針變量p,并讓p指向數(shù)組元素a[0]。所以代碼*p是引用 a[0]。由于數(shù)組a只有10個元素,最后一個元素是a[9],表達式a[10]是錯誤的。數(shù)組名a可以作為a的首元素的指針,表達式*a就是a[0] ,是對數(shù)組a的首元素a[0]的引用。指針p的值是a,表達式p-a。的值是0,所以a[p-a]就是a[0]。所以解答是②。
7.若有以下定義,則值為3的表達式是()
int a[]= {1,2,3,4,5,6,7,8,9,10},*p=a;
①p+=2,*(p++) ③p+=2,* ++p
③p+=3,*p++ ④ p+=2,++ *p
【解】數(shù)組a有10個元素,分別有值1至10,指針變量p指向a[0] ①逗號表達式 p+=2,*(P++),先是P+=2使P指向a[2],接著是*(P++),以當時P所指變量a[2]取內(nèi)容3為表達式的值,同時使p指向a[3]。②返號表達式p+=2,* ++p,先是p+=2使p指向a[2],以后是* ++p,又使 p增1,讓它指向a[3],并取指針p所指變量a[3]的內(nèi)容4作為表達
式的值。③逗號表達式 p+=3,*p++,先是p+=3使p指向a[3],以后是*p++,表達式的值是 a[3]為 4,而使p指向a[4]。④逗號表達式p+=2,++ *p,先是p+=2,使p指向a[2],以后是++ *p,因當時的*p就是 a[2],++a[2]使a[2]增1,變成4,并以4為表達式的值。所以只有p+=2,*(p++)的值是3。所以解答是①。
8.設(shè)有定義“char a[10]={"abcd"},*p=a;",則*(p+4)的值是( )
①"abCd" ②‘d‘
③‘\0‘ ④不能確定
【 解】若有char a[10]="abcd",*p=a,則指針變量p指向a[0]。在表達式*(p+4)中,p+4指向a[4],*(p+4)就是a[4]。由于用字符"abcd" 給字符數(shù)組a賦初值,a[4]的值是字符串結(jié)束標記符‘\0‘。所以解答是③。
9.設(shè)有代碼"int(*ptr)[10];”,其中的ptr是( )
①10個指向整型變量的指針
②指向10個整型變量的函數(shù)指針
③一個指向具有10個元素的一維數(shù)組的指針
④具有10個指針元素的一維數(shù)組
【解】代碼“int(*ptr)[10];”的分析過程是,因圓括號,括號內(nèi)的ptr先與字符*結(jié)合,字符*修飾標識符ptr是一種指針;接著與后面的一對方括號結(jié)合,表示是這樣的一種指針,是指向一維數(shù)組的;再有方括號中的10,說明這種數(shù)組有10個元素。至此,ptr是指向含10個元素的一維數(shù)組的指針。最后,是最前面的int,表示數(shù)組元素是int類型的。所以,ptr是一個指向具有10個int型元素的一維數(shù)組的指針。所以解答是③。另外,要是①,10個指向整型變量的指針,就是一個指針數(shù)組,上述代碼應(yīng)寫成“int *ptr[10];”,即ptr是一個有10個指向整型變量的數(shù)組。要是②,返回值是指向10個整型變量的函數(shù)的指針,上述代碼應(yīng)寫成“int(*(*ptr)())[10];”,即ptr是指針,指向一種函數(shù),函數(shù)的返回值又是一種指針,指向10個元素的數(shù)組,數(shù)組的元素是整型的。下面的代碼是這樣的函數(shù)指針和函數(shù)的例子:
# include<stdio.h>
int a[][10]={{1,2,3,4,5,6,7,8,9,0} ,{0,1,2,3,4,5,6,7,8,9} };
int(*(*ptr)(int))[10];
int(*f( int n))[10]
{return a+n;
}
void main()
{ int(*p)[10],*q;
ptr=f;/*讓ptr指向函數(shù)f*/
P=(*ptr)(0);
q=*p;
printf("%d\n", *p);
P=(*ptr)(l);
q=*p;
printf("%d\n", *q);
}
在上述代碼中,函數(shù)有一個int型的形參。要是④,其意義與①相同,上述代碼應(yīng)寫成“int* ptr[10];”,即 ptr是一個有10個元素的數(shù)組,數(shù)組元素是指向整型變量的指針。
10.若有以下定義,則數(shù)值為4的表達式是( )
int w[3][4]={{0,1},{2,4},{5,8}},(* p)[4]= W;
①*w[1]+l ②p++,*(p+1) ③w[2][2] ④p[1][1]
【解】二維數(shù)組定義有多種賦初值的辦法,問題給出的代碼是按行給數(shù)組的部分元素賦初值。它們分別是w[0][0]=0.w[0][1]=1、w[1][1]=2.w[1][1]=4,w[2][0]=5,w[2][1]=8。根據(jù)約定,未指定初值的元素自動置全0值。指針變量p是一個指向具有四個int型元素的一維數(shù)組的指針,定義時的初值使它指向數(shù)組W的第一行。①的代碼,*w[1]+1中的W[l]是指向 w[l][0]的指針,*w[1] 就是w[1][0],其值是2,*w[1]+l的值是3。②的代碼是逗號表達式,“p++,*(p+1)”先使p指向數(shù)組w的第二行,*(p+l)中的p+l是指向數(shù)組w的第三行,*(p+1)是指針值,指向數(shù)組w的第三行的第一個元素,即&w[2][0]. ③的代碼w[2][2]引用數(shù)組W第三行的第三列元素,其值是0。④的代碼p[1][l]引用數(shù)組W第二行的第二列元素w[1][1],其值是 4。所以解答是④。
11.若有下面的程序片段,則對數(shù)組元素的錯誤應(yīng)用的是( )
int a[12]={0},*p[3], * *pp,i;
for( i=0;i<3;i++) p[i]=&a[i+4];
pp= P;
①pp[0][1] ②a[10]
③ p[3][l] ④*(*(p+2)+2)
【解】上述代碼定義變量a是有12個整型元素的數(shù)組,它的初值全是0。p是有三個元素的指針數(shù)組,每個指針能指向整型變量。**pp是指針的指針,它能指向一個指向整型變量的指針, i是一個整型變量。執(zhí)行代碼for(i=0;i<3;i++) P[i]=&a[i+4] 使指針數(shù)組 p的元素 p[0]指向 a[4] ,p[l]指向a[5] ,p[2]指向 a[6]。代碼pp=p使指針變量pp指向p[0]。①代碼pp[0][l] 用指針表達可等價地寫成*(*pp+l)。其中*pp就是 p[0],p[0]的值是&a[4],*pp+1的值是&a[4]+1=&a[5],*(*pp+1)就是a[5]。②代碼a[l0] 當然是引用數(shù)組a的元素。③代碼p[3][1]數(shù)組p只有三個元素,沒有p[3],所以是錯誤的。④代碼*(*(p+2)+2)中的(p+2)是 &p[2],*(p+2)是 p[2],其值是&a[6],*(p+2)+2的值是&a[8],*(*(p+2)+2)引用的是a[8]。所以解答是③。
12.若有如下定義和語句,則輸出結(jié)果是( )
int * *pp, *p,a=10,b=20;
PP=&p; P=&a; P=&b; printf("%d%d\n",*p,* *PP);
①10, 20 ② 10, 10
③ 20, 10 ④ 20, 20
【解】上述代碼定義變量pp是指針的指針,它能指向一個指向整型變量的指針。定義變量p是指針,它能指向一個整型變量。a是一個整型變量,它有初值10。b也是一個整型變量,它有初值20。代碼 pp=&p 使pp指向p,p=&a使p指向a,p=&b又使p指向b,不再指向a。所以。p是引用b,其值為20。* *pp是通過pp間接引用p,再通過p間接引用b,所以也是20。所以解答是④。
13.若有以下定義和語句,則對w數(shù)組元素的非法引用是( )
int w[2][3],(* pw)[3]; pw= w;
① *(w[0]+2) ②*pw[2]
③pw[0][0] ④*(pw[l]+2)
【解】上述代碼定義2行3列的二維數(shù)組w,定義能指向有3個整型元素一維數(shù)組的指針pw,并讓pw指向數(shù)組w的第一行。①代碼*(w[0]+2)中的w[0]是&w[0][0],w[0]+2是&w[0][2],所以*(w[0]+2)就是w[0][2]。②代碼*pw[2]中的pw[2]是&w[2][0],該數(shù)組w只有2行,沒有w[2][0],所以代碼*pw[2]是對數(shù)組W元素的非法引用。③代碼pw[0][0]就是w[0][0]。④代碼*(pw[l]+2)中的pw[1]就是*(pw+l),即&w[l][0],pw[l]+2就是&w[l][2],所以*(pw[1]+2)就是w[1][2]。所以解答是②。
5.2 填充題
1.“* ”稱為___________運算符,“&”稱為_________運算符。
【解】單目運算符“*”稱為取內(nèi)容運算符,單目運算符“&”稱為取地址運算符。
2.若兩個指針變量指向同一個數(shù)組的不同元素,可以進行減法運算和___________運算。
【解】若兩個指針變量指向同一個數(shù)組的不同元素,可以進行減法運算求它們所指元素相差多少元素。進行關(guān)系運算,判定它們所指元素的前后,或是否指向同一個元素等。
3.設(shè) int a[10] ,*p=a;則對a[3]的引用可以是p[______________] 和*(p_________)。
【解】若指針p指向數(shù)組a的首元素,則引用a[3]用指針p可以寫成p[3]和*(p+3)。
4.若d是已定義的雙精度變量,再定義一個指向d的指針變量p的代碼是___________。
【解】若d是一個雙精度變量,定義能指向它的指針變量p可以用以下代碼double *p=&d。
5.&后跟變量名,表示該變量的_________;*后跟指針變量名,表示該指針變量_______。&后跟的是指針變量名,表示該指針變量的_____________。
【解】單目運算符&是取地址運算符,&后跟變量名,就表示該變量的地址。單目運算符*是取內(nèi)容運算符,*后跟指針變量名,表示該指針變量所指變量的內(nèi)容。若&后跟的是指針變量名,就表示該指針變量的地址。若知道指針變量的地址,欲通過指針變量的地址引用指針變量所指變量的內(nèi)容,需要連續(xù)兩次取內(nèi)容運算。
6.設(shè)有char *a="ABCD",則printf("%s",a)的輸出是_______;而printf("%c",*a)的輸出是______。
【解】若給字符指針變量a賦一個字符串常量"ABCD",實際上是給a賦指向字符串常量首字符‘A‘的指針。程序通過它訪問字符串中的各字符。如用代碼printf("%s",a) 輸出這個字符串常量"ABCD"的字符列ABCD,用代碼printf("%c",*a)輸出a所指的字符 A。
7.設(shè)有以下定義和語句,則*(*(p+2)+l)的值為__________。
int a[3][2]={10,20,30,40,50,60},(*p)[2];
p= a;
【解】上述代碼定義3行2列的二維數(shù)組a ,定義指向兩個元素的一維數(shù)組指針p,并讓p指向二維數(shù)組a的首行。則代碼*(*(p+2)+l)中的p+2指向二維數(shù)組a的第2行a[2],*(p+2)指向a[2][o],*(p+2)+l指向a[2][l],*(*(p+2)+l)是引用a[2][l],其值是60。
8.以下程序的功能是從鍵盤上輸入若干個字符(以回車符作為結(jié)束)組成一個字符串存入一個字符數(shù)組,然后輸出該字符數(shù)組中的字符串。請?zhí)羁铡?/font>
# include<ctype.h>
# include<stdio.h>
main()
{ char str[81],*sptr;
int i;
for(i=0;i<80;i++)
{ str[i]=getchar();if(str[i]==‘\n‘) break;}
str[i]=____________;
sptr=str;
while(* sptr) putchar(* sptr______________);
}
【解】從鍵盤輸入字符行,通過循環(huán)逐一輸入字符,當發(fā)現(xiàn)輸入字符是換行符時,結(jié)束循環(huán)。為了使輸入的字符列變成字符串,必須在輸入字符列之后,原存儲換行符的元素改為存儲字符串的結(jié)束標記符,需用代碼 str[i]=‘\0‘ ,所以在第一框填入代碼‘\0‘。當要將存于字符數(shù)組str中的字符串通過循環(huán)逐一輸出字符串的字符時,可以用字符指針sptr,讓sptr遍歷整個字符串,每次循環(huán)時,輸出sptr所指字符,并讓sptr增1,即可用代碼*sptr++實現(xiàn),所以在第二框填入代碼++。
5.3 程序分析題
1.閱讀下列程序,寫出程序的輸出結(jié)果。
main()
{char *a[6]={"AB","CD","EF","GH",U","KL"};
int i;
for(i=0;i<4;i++) printf("%s", a[i]);
printf("\n");
}
【解】程序定義了有六個元素的字符指針數(shù)組a ,數(shù)組a 的各元素指向字符率常量。程序的for循環(huán)遍歷了a的前四個元素,用字符率輸出格式,輸出指針數(shù)組a前四個元素所指的字符串。所以程序輸出: ABCDEFGH。
2.閱讀下列程序,寫出程序的主要功能。
main()
{ int i,a[l0],*p=&a[9] ;
for(i=0;i<10;i++) scanf("%d",&a[i]);
for(; p>=a; p--) printf("%d\n",*p) ;
}
【解】程序定義了有10個元素的整型數(shù)組a,另定義指針變量p,并讓它指向a的最后一個元素a[9]。執(zhí)行代碼的第一個循環(huán)是順序輸人數(shù)組a的10個元素。第二個循環(huán)利用指針p逆序遍歷數(shù)組a,將數(shù)組a的各元素逆序輸出。所以程序的功能是輸入10個整數(shù),并逆序輸出這10個整數(shù)。
3.閱讀下列程序,寫出程序運行的輸出結(jié)果。
char s[]="ABCD";
main()
{ char * p;
for( p=s;p< s+4;p++) printf("%s\n", p);
}
【解]程序定義了一個字符數(shù)組s,由給它所賦的字符串初值知,該數(shù)組只有五個元素。程序另定義了字符指針變量p。循環(huán)開始時,先讓p指向數(shù)組的首元素。循環(huán)每次輸出以p所指字符為首字符的字符串,并讓它指向下一個字符。如此反復(fù)循環(huán)四次,所以程序輸出以下內(nèi)容:
ABCD
BCD
CD
D
4.閱讀下列程序,試寫出程序運行的結(jié)果。
main()
{int i,b,c,a[]={1,10,-3,-21,7,13},*p_b,*p_c;
b=C=1;p_b=p_C= a;
for(i=0;i<6; i++)
{ if(b<*(a+i)) {b=*(a+i); p_b=&a[i]; }
if(c>*(a+i)) {c=*(a+i); p_c=&a[i]; }
}
i=*a;*a=*p_b;*p_b=i;i=*(a+5);*(a+5)=*p_c;*p_c=i;
printf("%d,%d,%d,%d,%d,%d\n", a[O],a[1],a[2],a[3], a[4], a[5]);
}
【解]程序定義了一個整型數(shù)組。,由給它所賦的初值知,該數(shù)組有六個元素。程序另定義了三個整型變量i.b、C和兩個指針變量p_b.p_c。程序首先置變量b和C都為1,p_b和p_c都指向數(shù)組a 的首元素a[0]。接著執(zhí)行六次循環(huán),循環(huán)體由兩個if語句。第一個if語句是當 b的值小于*(a+i)(就是a[i])時,將*(a+i)的值復(fù)制到b,并讓p_b指向a[i]。這是在a中找最大值,將最大值存于b,最大值元素的指針存于指針變量p_b。第二個if語句是當c的值大于*(a+i)(就是a[i])時,將*(a+i) 的值復(fù)制到c,并讓p_c指向a[i]。這是在a中找最小值,將最小值存于c,最小值元素的指針存于指針變量p_c。循環(huán)結(jié)束后的前三個語句實現(xiàn)最大元素與a[0]交換。接著三個語句是在已經(jīng)過前面交換的基礎(chǔ)上,將最小元與a[5]交換。最后程序順序輸出數(shù)組a的六個元素。所以程序輸出內(nèi)容是:
13, 10,-3, l, 7,-21。
若數(shù)組a的初值由輸入任意指定,上述程序?qū)σ环N特殊情況不能完成功能的要求,即最小元素若是a[0],p_c所指元素已被移到p_b指針所指位置,實際與a[5]交換的不再是數(shù)組中的最小元素,而是最大元素。
5.4 程序設(shè)計題
1.輸人3個整數(shù),按從大到小順序輸出。
【解】存儲輸入的三個整數(shù)可用三個簡單變量,也可用數(shù)組。設(shè)用三個簡單變量x,y,z存儲輸入的三個整數(shù)。另設(shè)若干個指針變量指向存儲輸入數(shù)據(jù)的變量。實現(xiàn)從大到小輸出三個整數(shù)有多種方案,如通過比較交換變量的值,多次比較交換使變量滿足條件x>=y>=z。這樣,變量的輸入值可能會與它的輸出值不一樣。如通過比較交換指針變量,當比較后發(fā)現(xiàn)要交換時,就交換變量的指針,而不交換變量的值,則在比較結(jié)束后,變量的值沒有改變,但從指針方向來看,它們的值是從大到小排列的。下面的程序就采用這種方案。
# include<stdio.h>
main()
{ int x,y,z;
int *big=&x,*mid=&y,*sma=&z,/*置三個指針變量分別指向x,y, z*/
*temp;
printf("Enter x,y,z.\n");
scanf("%d%d%d", big,mid,sma);/*順序為變量x,y,z輸入值*/
if(*big< *mid) {temp=big;big=mid; mid=temp; }/*使*big>=*mid*/
if(*big<*sma) { temp=big;big=sma;sma=temp; }/*使*big>=*sma*/
if(*mid<*sma){temp=mid;mid=sma;sma=temp; }/*使*mid>=*sma*/
printf("%d\t%d\t%d\n", x,y,z);/*按輸入順序輸出x,y,z*/
printf("%d\t%d\t%d\n",*big,*mid,*sma);/*按從大到小的順序輸出*/
}
2.編一個程序,輸入15個整數(shù)存入一維數(shù)組,再按逆序重新存放后再輸出。
【解】輸入數(shù)組的元素,并重新顛倒存放后輸出。將存儲于數(shù)組中的元素顛倒存儲,只要首尾相對應(yīng)的元素兩兩交換即可。若用指針實現(xiàn),可讓一個指針p指向前端的元素,另一個指針q指向與前端元素對應(yīng)的后端的元素。循環(huán)前,讓p指向數(shù)組的首元素,讓q指向數(shù)組的末元素。循環(huán)時,讓p和q所指兩個元素交換,并讓p增1,q減l。循環(huán)條件是p所指元素在前,q所指元素在后,即p<q。程序如下:
# include<stdio.h>
main()
{ int a[15],*p,*q, temp;
printf("Enter 15 numbers.\n");
for(p=a;p<a+15;p++)
scanf("%d", p);
for(p=a,q=a+14;p<q;P++,q--) {
temp=*p; *p=*q;*q=temp;
}
for(p=a;p<a+15;p++)
printf("%d\t",*p);
printf("\n");
}
3.輸入一個字符串,按相反的次序輸出其中的全部字符。
【解】要相反的次序輸出字符串的全部字符,可用一個字符指針變量,從指向字符串的本字符開始,逆序遍歷字符串,輸出指針所指字符即可。但為了讓字符指針指向字符串的末字符,若不用字符串處理庫函數(shù),得用一個循環(huán),讓它從字符串的首字符開始,順序移至字符串的結(jié)束標記符,然后倒退一個字符,就能讓它指向字符串的末字符。程序如下:
# include<stdio.h>
# define N 200
main()
{ char s[N],*p;
printf("Enter a string.\n");
scanf("%s", s);
for(p=s;*p; p++);
for(p--; p>=s; p--)
printf("%c",*p);
printf("\n");
}
4.輸入一個一維實型數(shù)組,輸出其中的最大值、最小值和平均值。
【解】設(shè)實型數(shù)組的元素個數(shù)n不超過20。程序輸入n,并用循環(huán)輸入數(shù)組的元素,再用循環(huán)遍歷數(shù)組,求出數(shù)組的最大值和最小值、數(shù)組元素的和。然后求出數(shù)組元素的平均值,最后輸出結(jié)果。程序如下:
# include<stdio.h>
# define N 20
main()
{ double a[N],max,min,ave,*p, t;
int n;
printf("Enter n(0<n<20).\n");
do{
scanf("%d",&n);
if(n>0 && n<20) break;
printf("n值不合要求,請重新輸入!\n");
} while(l);
printf("輸入%d個實數(shù)\n", n);
for(n=a;n<a+n; p++){
scanf("%lf",&t);*p=t;
}
max=min=ave=*a;
for(p=p+l;p<a+n; p++){
if(max<*p) max=*p;
if(min>*p) min=*p;
ave+=*p;
}
ave/=n;
printf("最大值:%f\t最小值:%f\t平均值:%f\n",max,min,ave);
}
5.輸入一個3×6的二維整型數(shù)組,輸出其中的最大值、最小值及其所在的行列下標。
【解】找出其最大值和最小值,及它們的行列位置。采用按行按列順序遍歷數(shù)組的方法找出數(shù)組的最大值、最小值,以及它們在數(shù)組中的位置指針。輸出時,將位置指針轉(zhuǎn)換成行下標和列下標。程序如下:
# include<stdio.h>
# define N 3
# define M 6
main()
{ int a[N][M],*maxp,*minp,*q,t;
printf("輸入%d個整數(shù)\n", N*M);
for(q=a[0];q<*a+N*M;q++) {
scanf("%d",&t);*q=t;
}
maxp=minp=*a;
for(q=a[0];q<*a+ N*M; q++) {
if(*maxp<*q) maxp=q;
if(*minp>*q) minp=q;
}
printf("最大值:%d它的行下標是%d它的列下標是%d\n",
*maxp,(maxp-*a)/M,(maxp-*a)%M);
printf("最小值:%d它的行下標是%d它的列下標是%d\n",
*minp,(minp-*a)/M,(minp-*a)%M;
}
6.輸入三個字符串,找出其中最大的字符串。
【解】將輸入的三個字符率分別存于三個一維字符數(shù)組中,另用一個字符指針數(shù)組,分別指向這三個字符串,然后用循環(huán)控制這三個字符串的比較,找出最大的字符串。兩字符串比較時,程序不用標準庫函數(shù),而用兩字符串的對應(yīng)字符比較來實現(xiàn)。完整程序如下:
# include<stdio.h>
# define N 120
# define M 3
mian()
{ char s1[N], s2[N],s3[N],*strs[M]={s1,s2,s3},*p,*q,*ms;
int i;
printf("輸入%d個字符串\n", M) ;
for(i= 0; i<M; i++)
scanf("%s",strs[i]);
ms=strs[0];
for(i=1;i<M; i++) {
for( p=ms,q=strs[i];*p! =‘\0‘ && *p==*q;p++,q++);
if(*p<*q) ms=strs[i];
}
printf("最大字符串:%s\n",ms);
}
7.輸入兩個字符串,將它們連接后輸出。
【解】程序設(shè)有兩個存儲字符串的數(shù)組,先輸入兩個字符串,然后找到第一個字符串的末尾,接著將第二個字符串復(fù)制在第一個字符串的后面,然后輸出。程序如下:
# include<stdio.h>
# define N 120
main()
{ char s1[N+N],s2[N],*p,*q;
printf("輸入2個字符串\n");
scanf("%s%s",s1,s2);
for(p=sl;* p!=‘\0‘; p++);
for(q=s2;*p++=*q++;);
printf("兩字符串連接后:%s\n" ,sl);
}
8.比較兩個字符串是否相等。
【解】程序設(shè)兩個存儲字符串的數(shù)組,先輸入兩個字符串,兩字符率比較時,直接用兩字符串的對應(yīng)字符比較來實現(xiàn)。完整程序如下:
# include<stdio.h>
# define N 120
main()
{ char sl[N] ,s2[N],*p,*q;
char *result[]={"小于","相等" ,"大于"};
int comp;
printf("輸入 2個字符串\n");
scanf("%s%s",s1,s2);
for(p=sl,q=s2;*q!=‘\0‘&& *p==*q; p++, q++);
comp=*P <* q? 0:*P==*q? l:2;
printf("字符串1與字符串2比較:%s\n",result[comp]);
}
9.輸入10個整數(shù),將其中最大數(shù)與最后一個數(shù)交換,最小數(shù)與第一個數(shù)交換。
【解】程序設(shè)一個一維數(shù)組存儲輸入的10個整數(shù)。然后遍歷數(shù)組,找出最大元素和最小元素的指針。接著按要求先將最大元素與最后一個元素交換,然后將最小元素與第一個元素交換。最后,輸出數(shù)組中的全部整數(shù)。程序應(yīng)考慮到這樣一種特殊情況,即最后一個元素正是最小元素,它在與最大元素交換后,位置已移到原先存儲最大元素的位置。程序應(yīng)保證最大元素移到末尾,最小元素移到最前端。程序如下:
# include<stdio.h>
# define N 10
main()
{ int a[N],*maxp,*minp,*q,t;
printf("入%d個整數(shù)\n,N);
for(q=a;q<a+N;q++) {
scanf("%d",&t);*q=t;
}
maxp= minp= a;
for(q=a;q<a+N;q++){
if(*maxp<*p) maxp=q;
if(*minp>*q) minp=q;
}
t=*maxp; *maxp=a[N-1]; a[N-l]=t;
if(minp==&a[N-l]) minp=maxp;
t=* minp;*minp= a[0]; a[0]= t;
for(q=a;q<a+N; q++)
printf("%d",*q);
printf("\n");
}