第八章 习题
一、选择题
1、若x为整型变量,p是指向整型数据的指针变量,则正确的赋值表达式是( )。
A)p=&x B)p=x C)*p=&x D)*p=*x
2、已知:int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;则不能表示数组a中元素的表达式是 ( )。
A)*p B)a[10] C)*a D)a[p-a]
3、已知:int a[3][4],*p=a;则p表示 ( )。 A) 数组a的0行0列元素 B) 数组a的0行0的地址 C) 数组a的0行首地址 D) 以上均不对
4、设有说明int (*ptr)[M];其中的标识符ptr是 ( )。 A) M个指向整型变量的指针 B) 指向M个整型变量的函数指针
C) 一个指向M个整型元素的一维数组的指针
D) 具有M个指针元素的一维指针数组,每个元素都只能指向整型变量
5、已知:char str[]=\对指针变量ps的说明和初始化是( )。 A) char ps=str; B) char *ps=str; C) char ps=&str; D) char *ps=&str;
6、 若有以下调用语句,则不正确的fun函数的首部是( )。 A) void fun(int m, int x[]) B) void fun(int s, int h[41]) C) void fun(int p, int *s) D) void fun(int n, int a) main()
{ …
int a[50],n; …
fun(n, &a[9]); …
}
7、 有以下程序
void fun(char *a, char *b) { a=b; (*a)++; } main ()
{ char c1=\p1=&c1; p2=&c2; fun(p1,p2);
printf(“&c&c\\n”,c1,c2); }
程序运行后的输出结果是( ) 。 A) Ab
B) aa C) Aa D) Bb
8、 下列程序段的输出结果是( ) 。
A) 2 1 4 3 B) 1 2 1 2 C) 1 2 3 4 D) 2 1 1 2
void fun(int *x, int *y)
{ printf(“%d , %d”, *x, *y); *x=3; *y=4;} main()
{ int x=1,y=2; fun(&x,&y);
printf(“%d %d”,x, y); }
9、 有如下说明
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
则数值为9的表达式是( )。
A) *P+9 B) *(P+8) C) *P+=9 D) P+8 10、有以下程序
main()
{ int x[8]={8,7,6,5,0,0},*s; s=x+3
printf(\
}
执行后输出结果是( ) 。 A) 随机值
B) 0 C) 5 D) 6
11、 有如下程序
main()
{ char s[]=”ABCD”, *P;
for(p=s+l; p
该程序的输出结果是( ) 。
A) ABCD B) A C) B D) BCD
BCD B C CD CD C D D D D 12、 已定义以下函数
fun(char *p2, char *p1)
{ while((*p2=*p1)!=‘\\0’){p1++;p2++; } }
函数的功能是( )。
A) 将p1所指字符串复制到p2所指内存空间 B) 将p1 所指字符串的地址赋给指针 p2 C) 对p1和p2两个指针所指字符串进行比较 D) 检查p1和p2两个指针所指字符串中是否有‘\\0’ 13、有以下程序
main()
{ char *s[]={\ }
p=s[1];
printf(\
执行后输出结果是( )。 A) n,two
B) t,one
C)w,one
D) o,two
14、 若有以下定义和语句: int s[4][5],(*ps)[5]; ps=s;
则对s数组元素的正确引用形式是( )。 A) ps+1 15、有以下程序段
main()
{ int a=5, *b, **c; c=&b; b=&a; …… }
B) *(ps+3) C) ps[0][2] D) *(ps+1)+3
程序在执行了c=&b:b=&a;语句后,表达式:**c的值是( )。 A) 变量a的地址 B) 变量b中的值 C) 变量a中的值 D) 变量b的地址
二、填空题
1、要使指针变量与变量之间建立联系,可以用运算符 (1) 来定义一个指针变量,用运算符 (2) 来建立指针变量与变量之间的联系。
2、已知:int a[2][3]={1,2,3,4,5,6},*p=&a[0][0];则表示元素a[0][0]的方法有指针法: (1) ,数组名法: (2) 。*(p+1)的值为 (3) 。
3、以下程序的输出结果是 。
main()
{ int arr[ ]={30,25,20,15,10,5}, *p=arr; p++;
printf(“%d\\n”,*(p+3)); }
4、 以下程序调用findmax函数返回数组中的最大值。
findmax(int *a,int n) { int *p,*s; for(p=a,s=a;p-a { int x[5]={12,21,13,6,18}; printf(\} 5、 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。 #include main() { char *p, s[6]; int n; p=s; gets(p); n=*p-'0'; while(______!='\\0') n=n*8+*p-'0'; printf(\ } 三、编程题 1.编程实现从键盘输入一个字符串,将其字符顺序颠倒后重新存放,并输出这个字符串。 2.从键盘任意输入10个整数,用函数编程实现计算最大值和最小值,并返回它们所在数组中的位置。 3.将5个字符串从小到大排序后输出。 4.编写一个能对任意m×n阶矩阵进行转置运算的函数Transpose()。 第八章 习题答案 一、选择题 1-5 A B C C B 6-10 D A C B B 11-15 D A C C C 二、填空题 1. (1)* (2) & 2. (1) *p (2) **a (3) 2 3. 10 4. *p>*s 5. *(++p) 三、编程题 1. 编程实现从键盘输入一个字符串,将其字符顺序颠倒后重新存放,并输出 这个字符串。 #include /*函数功能: 实现字符串逆序存放 函数参数: 字符指针变量,所指向的存储单元存放源字符串,逆序后的字符串也存放于此 返回值: 无*/ void Inverse(char *pStr) { int len; char temp; char *pStart; char *pEnd; /*指针变量pStart指向字符串的第一个字符*/ /*指针变量pEnd指向字符串的最后一个字符*/ /*求出字符串长度*/ char str[80]; printf(\gets(str); /*输入字符串*/ /*将存于str数组中的字符串逆序存放*/ /*输出字符串*/ Inverse(str); puts(str); printf(\ len = strlen(pStr);