前言:
上次我们总结了c语言指针,但是指针作为编程语言极为重要的知识,我们仍需多加练习。
今天小杨找了十道指针练习题供大家思考,对于初学者理解指针还是蛮有帮助的。
我会把答案和解析放到所有题目的末尾。有兴趣的可以做做看^_^
第一题
第二题
第三题
第四题
第五题
第六题
ps:如果p=&arr[0]呢?答案都是多少?
第七题
第八题
第九题
题目
以下关于 int (*p)[5];
的描述,正确的是:
A. p 是一个指针数组,每个元素是 int 类型的指针
B. p 是一个数组指针,指向包含 5 个 int 元素的数组
C. p 是一个函数指针,指向返回值为 int、参数为 5 个 int 的函数
D. p 是一个 int 类型的指针,指向包含 5 个元素的数组
第十题
题目
以下声明中,属于指针数组的是:
A. int (*arr)[10];
B. int *arr[10];
C. int (*func)(int);
D. int func(int *arr);
第一题解析
- 二维数组
a
是指向第一行的数组指针(类型为int (*)[3]
),按行优先连续存储,布局为1,2,3,4,5,6
。 *(*(a+1)+1)
解析:a+1
使数组指针移动 1 个行单位(跳过 3 个 int),指向第二行起始地址。*(a+1)
解引用后转为int*
类型,指向第二行第一个元素。*(a+1)+1
移动 1 个 int 单位,指向第二行第二个元素(值为 5)。- 解引用后得到 5。
a[1][1]
直接访问第二行第二个元素,值为 5。- 输出结果:
5, 5
第二题解析
sizeof(str)
分析:str
是字符数组,存储"hello"
时自动添加结束符'\0'
,共 6 个字符。- 每个字符占 1 字节,故结果为 6。
sizeof(p)
分析:p
是字符指针,指针大小取决于系统位数。- 32 位系统占 4 字节,64 位系统占 8 字节。
- 输出结果:
6, 4
(32 位)或6, 8
(64 位)
第三题解析
数组退化:当数组名作为函数参数传递时,会自动转换为指向数组首元素的指针
(如果不进行退化,在函数调用时把所有元素逐个复制到函数的栈空间中,消耗大量的时间空间。
在函数内部(数组退化)中,sizeof(arr)得出的是指针的大小,arr++(普通指针)会使指针移动到下一个元素的地址
外部不可以用arr++遍历,因为arr代表数组的首地址,是一个常量指针,不可以被修改
- 数组作为函数参数时发生退化,
func
函数中的arr
实际是int*
类型指针。 sizeof(arr)
计算的是指针大小:- 32 位系统下为 4 字节,64 位系统下为 8 字节。
- 输出结果:
4
(32 位)或8
(64 位)
第四题解析
p
是数组指针(int (*)[4]
),指向包含 4 个 int 的数组,与a
类型匹配。*(*(p+1)+2)
解析:p+1
移动 1 个行单位(跳过 4 个 int),指向第二行。*(p+1)
转为int*
类型,指向第二行第一个元素。*(p+1)+2
移动 2 个 int 单位,指向第二行第三个元素(值为 7)。- 解引用后得到 7。
p[2][3]
是第三行第四个元素,值为 12。- 输出结果:
7, 12
第五题解析
- 同类型指针相减结果为元素个数,计算公式:(地址差)/ 单个元素字节数。
p1
指向arr[0]
,p2
指向arr[4]
,两者间隔 4 个 int 元素。- 输出结果:
4
第六题解析
- 二维数组
arr
按行优先连续存储,布局为1,2,3,4
。 p
是int*
类型指针,指向arr[0][0]
。p+2
指向arr[1][0]
(值为 3),p+3
指向arr[1][1]
(值为 4)。- 输出结果:
3, 4
第七题解析
- 初始
p
指向x
,q
指向y
。 p = q
后,p
与q
均指向y
。*p = 15
修改的是y
的值,x
保持 5 不变。- 输出结果:
5, 15
第八题解析
*(ptr++) += 10
执行逻辑:- 先对当前
ptr
(指向arr[0]
)执行*ptr += 10
,使arr[0]
变为 11。 - 再执行
ptr++
,ptr
指向arr[1]
。
- 先对当前
*ptr
为arr[1]
的值 2,*arr
为arr[0]
的值 11。- 输出结果:
2, 11
第九题解析
int (*p)[5]
中,()
优先级高于[]
,p
先与*
结合,表明是指针。- 后面
[5]
表示该指针指向包含 5 个 int 元素的数组,即数组指针。 - 选项分析:A 是指针数组,C 是函数指针,D 是普通指针,均错误。
- 正确答案:B
第十题解析
- 指针数组定义为 “数组元素为指针”,
[]
优先级高于*
,数组名先与[]
结合。 - 选项分析:
- A 是数组指针,B 中
arr
先与[]
结合,是数组且元素为int*
,符合指针数组定义。 - C 是函数指针,D 是普通函数声明,均错误。
- A 是数组指针,B 中
- 正确答案:B
对于指针的深入暂时就到这里!(以后可能还会继续)
小杨在此预祝各位事业飞黄腾达!
感谢浏览!