小杨学编程 Day 5 C语言 指针练习

前言:

上次我们总结了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);

第一题解析

  1. 二维数组a是指向第一行的数组指针(类型为int (*)[3]),按行优先连续存储,布局为1,2,3,4,5,6
  2. *(*(a+1)+1)解析:
    • a+1使数组指针移动 1 个行单位(跳过 3 个 int),指向第二行起始地址。
    • *(a+1)解引用后转为int*类型,指向第二行第一个元素。
    • *(a+1)+1移动 1 个 int 单位,指向第二行第二个元素(值为 5)。
    • 解引用后得到 5。
  3. a[1][1]直接访问第二行第二个元素,值为 5。
  4. 输出结果:5, 5

第二题解析

  1. sizeof(str)分析:
    • str是字符数组,存储"hello"时自动添加结束符'\0',共 6 个字符。
    • 每个字符占 1 字节,故结果为 6。
  2. sizeof(p)分析:
    • p是字符指针,指针大小取决于系统位数。
    • 32 位系统占 4 字节,64 位系统占 8 字节。
  3. 输出结果:6, 4(32 位)或6, 8(64 位)

第三题解析

数组退化:当数组名作为函数参数传递时,会自动转换为指向数组首元素的指针
(如果不进行退化,在函数调用时把所有元素逐个复制到函数的栈空间中,消耗大量的时间空间。
在函数内部(数组退化)中,sizeof(arr)得出的是指针的大小,arr++(普通指针)会使指针移动到下一个元素的地址
外部不可以用arr++遍历,因为arr代表数组的首地址,是一个常量指针,不可以被修改

  1. 数组作为函数参数时发生退化,func函数中的arr实际是int*类型指针。
  2. sizeof(arr)计算的是指针大小:
    • 32 位系统下为 4 字节,64 位系统下为 8 字节。
  3. 输出结果:4(32 位)或8(64 位)

第四题解析

  1. p是数组指针(int (*)[4]),指向包含 4 个 int 的数组,与a类型匹配。
  2. *(*(p+1)+2)解析:
    • p+1移动 1 个行单位(跳过 4 个 int),指向第二行。
    • *(p+1)转为int*类型,指向第二行第一个元素。
    • *(p+1)+2移动 2 个 int 单位,指向第二行第三个元素(值为 7)。
    • 解引用后得到 7。
  3. p[2][3]是第三行第四个元素,值为 12。
  4. 输出结果:7, 12

第五题解析

  1. 同类型指针相减结果为元素个数,计算公式:(地址差)/ 单个元素字节数。
  2. p1指向arr[0]p2指向arr[4],两者间隔 4 个 int 元素。
  3. 输出结果:4

第六题解析

  1. 二维数组arr按行优先连续存储,布局为1,2,3,4
  2. pint*类型指针,指向arr[0][0]
  3. p+2指向arr[1][0](值为 3),p+3指向arr[1][1](值为 4)。
  4. 输出结果:3, 4

第七题解析

  1. 初始p指向xq指向y
  2. p = q后,pq均指向y
  3. *p = 15修改的是y的值,x保持 5 不变。
  4. 输出结果:5, 15

第八题解析

  1. *(ptr++) += 10执行逻辑:
    • 先对当前ptr(指向arr[0])执行*ptr += 10,使arr[0]变为 11。
    • 再执行ptr++ptr指向arr[1]
  2. *ptrarr[1]的值 2,*arrarr[0]的值 11。
  3. 输出结果:2, 11

第九题解析

  1. int (*p)[5]中,()优先级高于[]p先与*结合,表明是指针。
  2. 后面[5]表示该指针指向包含 5 个 int 元素的数组,即数组指针。
  3. 选项分析:A 是指针数组,C 是函数指针,D 是普通指针,均错误。
  4. 正确答案:B

第十题解析

  1. 指针数组定义为 “数组元素为指针”,[]优先级高于*,数组名先与[]结合。
  2. 选项分析:
    • A 是数组指针,B 中arr先与[]结合,是数组且元素为int*,符合指针数组定义。
    • C 是函数指针,D 是普通函数声明,均错误。
  3. 正确答案:B

对于指针的深入暂时就到这里!(以后可能还会继续)

小杨在此预祝各位事业飞黄腾达!

感谢浏览!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值