练习题8及参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习题8及参考答案
1. 单项选择题
(1)有以下定义和赋值语句中,正确的是。
A. static char str[8]="Good morning";
B. char str[20];str="Good morning";
C. char *p="Good morning";
D. char *p;*p="Good morning";
【答】选项在定义字符指针变量的同时初始化为指向字符串常量的第一个字符。本题答案为C。
(2)已知变量a已定义为int型变量,以下定义并初始化指针变量p的语句中正确的是。
A. int *p=a;
B. int *p=*a;
C. int p=&a;
D. int *p=&a;
【答】D
(3)以下叙述正确的是。
A. 数组名实际上是此数组的首地址,所以数组名相当于一个指针变量
B. 若定义数组 a[2][3],则a+1和*(a+1)完全相等
C. 若定义数组 a[2][3],则++a和a[1]完全等价
D. 某函数的形参为一个数组,则调用此函数时只能将数组名作为对应的实参
【答】选项A是错误的,数组名的确是数组的首地址,但它的值是一个常量,不可改变;选项B是正确的,在二维数组中,若a为数组名,则a+i和*(a+i)同样表示此数组第i行的首地址,所以完全相等,参见《C程序设计教程》的表8.1;选项C是错误的,数组名是数组的首地址,是一个常量,不能执行++运算;选项D是错误的,某函数的形参为一个数组,调用此函数时可将数组名作为对应的实参,也可以将相应的指针变量作为对应的实参。本题答案为B。
(4)有这样的定义float *p[4];则下面的叙述中正确的是。
A. 此定义不正确,形如char *p[4];的定义才是正确的
B. 此定义正确,p是指向一维实型数组的指针变量,而不是指向单个实型变量的指针变量
C. 此定义不正确,C语言中不允许类似的定义
D. 此定义正确,定义了一个指针数组
【答】其中正确答案为D。该语句中,“[]”的优先级最高,所以p是一个数组,其次是float *,进一步表示p数组中每个元素为指向float型数的指针。
(5)若有以下定义语句:
static int a[2][3]={1,3,5,7,9,11};
int m,n;
且0≤m≤1,0≤n≤2,则是对数组元素的正确引用。
A. a[m]+n
B. *(a+5)
C. *(*(a+m)+3)
D. *(*(a+m)+n)
【答】*(*(a+m)+n)等价于a[m][n]。本题答案为D。
(6)有如下函数:
fun(int *p1,int *p2)
{
int *p;
*p=*p1;
*p1=*p2;
*p2=*p;
}
其功能为。
A. 正确,但无法改变*p1和*p2的值
B. 能够成功交换*p1和*p2的值
C. 能够成功交换*p1和*p2的地址
D. 能够成功交换p1和p2的值
【答】该函数交换了*p1和*p2的值,若以fun(&a,&b);语句调用该函数,则交换了a和b的值。本题答案为B。
(7)下面各语句行中,能正确进行字符串赋值操作的是。
A. char st[4][5]={"ABCDE"};
B. char s[5]={'A','B','C','D','E'};
C. char *s;s="ABCDE";
D. char *s;scanf("%s",s);
【答】首先可以排除选项A,因其形式不对。也可以排除选项B,因为字符数组的长度不够,没有考虑字符串结束符。选项D也是错误的,其错误的原因是:在这两条语句中,只确定了指针变量p本身在内存中的地址,但p所指的值没有确定。所以,只有选项C是正确的,C语言中规定可以给字符指针单独赋值。本题答案为C。
(8)执行以下程序段后,m的值为。
static int a[2][3]={1,2,3,4,5,6};
int m,*ptr=&a[0][0];
m=(*ptr)*(*ptr+2)*(*ptr+4);
A. 15
B. 48
C. 24
D. 无定值
【答】*ptr=1,*ptr+2=3,*ptr+4=5,m=1*3*5=15。本题答案为A。
(9)设有定义:
static a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*prt)[3]=a,*p=a[0];
则以下能够正确表示数组元素a[1][2]的表达式是。
A. *((*prt+1)[2])
B. (2)*(*(p+5))
C. (*prt+1)+2
D. *(*(a+1)+2)
【答】a是一个二维数组。int (*prt)[3]=a定义中,由于有括号,“*”优先级高,即prt是一个指针,后面有“[3]”,表示prt是一个包含三个元素的数组的指针。int *p=a[0]的初始化中,表示p是一个整数指针变量,指向a数组的第一行的第一个元素即a[0][0]。
用prt表示a[1][2]的各种方式如下:
*(prt[1]+2)
*(*(prt+1)+2)
(*(prt+1))[2]
prt[1][2]
再看以上各种表达式:
选项A、C显然是错误的;选项B中,p+5指向a[0][5],执行两次“*”肯定是错误的;选项D是正确的,因为a是常量,是数组的首地址,*(a+1)指向第二行, *(*(a+1)+2)表示第二行的第三个元素,即a[1][2]。本题答案为D。
(10)若有定义char s[3][4];以下对数组元素s[i][j]的各种引用形式中正确的是。
A.*(s+i)[j]
B.*(&s[0][0]+4*i+j)
C.*((s+i)+j)
D.*(*(s+i)[j])
【答】选项A是错误的,*(s+i)[j]表达式中,运算符[]的优先级最高,故此表达式相当于*(*(s+i+j)),显然这是此数组第i+ j行的第 0个元素的值,而不是s[i][j];选项B是正确的,*(&s[0][0]+4*i+j)是直接使用偏移量法来引用数组元素,根据二维数组在内存中的行优先顺序存放规则,*(&s[0][0]+4*i+j)等价于s[i][j];选项C是错误的,*((s+i)+j)等价于*(s+i+j),是数组第i+j行首地址;选项D是错误的,*(*(s+i)[j])等价于
***(s+i+j),是错误的表达方式。本题答案为B。
(11)有如下程序:
#include
main()