内容正文:
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《编程语言基础-C语言》(高教版第5版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《编程语言基础-C语言》(高教版第5版)一课一练的第8章的第44练,内容涵盖第8章 指针的8.3指向数组的指针变量。
《编程语言基础-C语言》(高教版第5版)第44练
第8章 指针
8.3 指向数组的指针变量(原卷版)
一、单项选择题(本题共5小题)
1、若有定义 int a[5] = {1,2,3,4,5}; 和 int *p;,则使 p 指向数组 a 的第一个元素的正确赋值语句是( )
A. p = a;
B. p = &a[0];
C. p = &a;
D. A和B都正确
2、若有定义 int a[5] = {10,20,30,40,50}, *p = a;,则 *(p+3) 的值是( )
A. 20
B. 30
C. 40
D. 50
3、以下程序段中,输出结果是( )
int a[3] = {1, 2, 3};
int *p = a;
printf("%d,", *p++);
printf("%d", *p);
A. 1,2
B. 2,2
C. 1,1
D. 2,3
4、若定义 int a[4] = {2,4,6,8}, *p = &a[2];,则 p[-1] 的值是( )
A. 2
B. 4
C. 6
D. 8
5、以下关于数组名和指针的说法,正确的是( )
A. 数组名是一个指针常量,不能被赋值
B. 数组名与指向数组首元素的指针完全相同,可以相互赋值
C. 对数组名进行自增运算是合法的
D. 数组名和指针变量都占用4个字节(32位系统)
二、判断题(本题共5小题)
1、执行 int a[5], *p = a; 后,表达式 p+1 和 a+1 都表示数组第二个元素的地址,并且两者值相同。( )
2、通过指针引用数组元素时,*(p+i) 与 p[i] 完全等价,但 p[i] 的写法更简洁直观。( )
3、若有定义 int a[10], *p = a;,则 p[10] 引用的是数组的第11个元素,已经越界,但编译器不会报错,运行可能导致未知错误。( )
4、指向数组元素的指针变量支持关系运算,用于比较两个指针所指向的位置关系,前提是它们指向同一数组。( )
5、若有定义 int a[3][4];,则定义指向一维数组的指针变量时,正确的语句是 int *p[4];。( )
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:考虑到中职学生普遍基础知识相对薄弱的情况,我们依据支架式教学理念,精心编制了《编程语言基础-C语言》(高教版第5版)一课一练。专辑里的每一份练习,都与课堂所授知识点紧密相关,题目围绕课堂所学知识点呈现。目的在于激发学生的学习兴趣,培养他们的学习自觉性,帮助学生扎实掌握课程的基本概念与基本方法,为他们后续的进一步提升奠定坚实基础。
本卷是《编程语言基础-C语言》(高教版第5版)一课一练的第8章的第44练,内容涵盖第8章 指针的8.3指向数组的指针变量。
《编程语言基础-C语言》(高教版第5版)第44练
第8章 指针
8.3 指向数组的指针变量(解析版)
一、单项选择题(本题共5小题)
1、若有定义 int a[5] = {1,2,3,4,5}; 和 int *p;,则使 p 指向数组 a 的第一个元素的正确赋值语句是( )
A. p = a;
B. p = &a[0];
C. p = &a;
D. A和B都正确
【答案】D
【解析】数组名 a 在表达式中代表数组首元素的地址,即 &a[0]。因此 p = a; 和 p = &a[0]; 都是正确的。2、若有定义 int a[5] = {10,20,30,40,50}, *p = a;,则 *(p+3) 的值是( )
A. 20
B. 30
C. 40
D. 50
【答案】C
【解析】p 指向 a[0],p+3 指向 a[3](指针移动3个元素),*(p+3) 即 a[3] 的值40。
3、以下程序段中,输出结果是( )
int a[3] = {1, 2, 3};
int *p = a;
printf("%d,", *p++);
printf("%d", *p);
A. 1,2
B. 2,2
C. 1,1
D. 2,3
【答案】A
【解析】*p++ 等价于 *(p++),即先取 *p(值为1),然后 p 自增指向下一个元素。第一个输出1;此时 p 指向 a[1],第二个输出 *p 为2。结果:1,2。注意后缀 ++ 优先级高于 *,但后置自增先返回原值再自增,因此先取值后移动指针。
4、若定义 int a[4] = {2,4,6,8}, *p = &a[2];,则 p[-1] 的值是( )
A. 2
B. 4
C. 6
D. 8
【答案】B
【解析】p 指向 a[2](值为6),p[-1] 等价于 *(p-1),指向 a[1],值为4。C语言中指针可以用负下标访问前面的元素,只要不越界。
5、以下关于数组名和指针的说法,正确的是( )
A. 数组名是一个指针常量,不能被赋值
B. 数组名与指向数组首元素的指针完全相同,可以相互赋值
C. 对数组名进行自增运算是合法的
D. 数组名和指针变量都占用4个字节(32位系统)
【答案】A
【解析】数组名是一个地址常量,它代表数组首元素的地址,不能出现在赋值运算符的左侧(不能自增或赋值)。
二、判断题(本题共5小题)
1、执行 int a[5], *p = a; 后,表达式 p+1 和 a+1 都表示数组第二个元素的地址,并且两者值相同。( )
【答案】√
【解析】p 指向 a[0],p+1 指向下一个元素 a[1]。数组名 a 代表首地址,a+1 也是 a[1] 的地址。两者值相等,类型也相同(都是 int *)。所以正确。
2、通过指针引用数组元素时,*(p+i) 与 p[i] 完全等价,但 p[i] 的写法更简洁直观。( )
【答案】√
【解析】C语言规定 p[i] 与 *(p+i) 等价,编译器会按照指针运算处理。这是数组下标运算的本质。因此两种写法完全等价,通常使用 p[i] 更符合数组的习惯用法。
3、若有定义 int a[10], *p = a;,则 p[10] 引用的是数组的第11个元素,已经越界,但编译器不会报错,运行可能导致未知错误。( )
【答案】√
【解析】C语言不检查数组越界,p[10] 在语法上等价于 *(p+10),访问了数组范围之外的内存。编译可通过,但运行时可能发生段错误或篡改其他数据,应避免。
4、指向数组元素的指针变量支持关系运算,用于比较两个指针所指向的位置关系,前提是它们指向同一数组。( )
【答案】√
【解析】指向同一数组的两个指针可以进行比较(<、>、==等),结果取决于它们在数组中的先后顺序。
5、若有定义 int a[3][4];,则定义指向一维数组的指针变量时,正确的语句是 int *p[4];。( )
【答案】×
【解析】int *p[4]; 定义的是指针数组,即包含4个 int * 元素的数组。要定义指向二维数组行(即一维数组)的指针变量,应使用 int (*p)[4];,表示 p 是一个指针,指向包含4个整型元素的一维数组。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$