指针和数组笔试题2

本文详细解释了C语言中指针、数组和sizeof运算符在处理一维和二维数组时的内存计算,以及字符串长度计算的注意事项,包括地址大小、元素大小和非法访问的错误用法。
摘要由CSDN通过智能技术生成

一、字符串数组

 

char* p = " abcdef ",p是一个指针变量,存放的是数组首元素a的地址。

1.sizeof(p),计算的是一个指针变量的大小,为4(32位平台)或8(64位平台)。

2.sizeof(p+1),p+1也是一个指针变量,其大小为4或8。

3.sizeof(*p),对p进行解引用操作,得到第一个元素,其大小为1。

4.sizeof(p[0]),p[0]相当于*(p+0),因此计算的是第一个元素大小,为1。

5.sizeof(&p),&p取出的是p的地址,计算的是地址的大小,为4或8。

6.sizeof(&p+1),&p+1是跳过p的地址,计算的还是地址的大小,为4或8。

7.sizeof(&p[0]+1),p[0]表示的是第一个元素,&p[0]取出第一个元素的地址,加1表示第二个元素的地址,计算的是地址的大小,为4或8。

8.strlen(p),计算整个字符串的长度,为6。

9.strlen(p+1),计算的是从第二个元素开始到'\0'之间的长度,为5。

10.strlen(*p)和strlen(p[0])这种写法是错误的。

11.strlen(&p),&p取出的是p的地址,但是内存上放的是什么并不知道,因此返回值为随机值。

12.strlen(&p+1),同11,为随机值。

13.strlen(&p[0]+1),&p[0]+1表示的是第二个元素的地址,计算的是从第二个元素开始到'\0'之间的长度,为5。

二、二维数组

1.sizeof(a),计算整个数组的大小,为3*4*sizeof(int)=48。

2.sizeof(a[0][0]),计算第一个元素的大小,为4。

3.sizeof(a[0]),a[0]可以理解为第一行的数组名,计算的是整个第一行的大小,因此为16。

4.sizeof(a[0]+1),a[0]作为数组名没有单独放在sizeof内部,也没有取地址,因此a[0]就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址,计算的就是地址的大小,为4或8。

5.sizeof(*(a[0]+1)),a[0]+1是第一行第二个元素的的地址,所以*(a[0]+1)取出的就是第一行第二个元素,计算的是第一行第二个元素的大小,为4。

6.sizeof(a+1),a表示的是第一行的地址,a+1表示的就是第二行的地址,计算地址的大小,为4或8。

7.sizeof(*(a+1)),a+1是第二行的地址,*(a+1)表示整个第二行,计算的就是第二行的大小,为16。

8.sizeof(&a[0]+1),a[0]是第一行的数组名,&a[0]取出的是第一行的地址,加1就是第二行的地址,计算的是地址的大小,为4或8。

9.sizeof(*(&a[0]+1)),计算第二行的大小,为16。

10.sizeof(*a),a为首元素的地址,即第一行的地址,所以*a就是第一行,大小为16。

11.sizeof(a[3]),a[3]其实是第四行的数组名(如果有的话),所以其实是不存在的,但也能通过类型计算大小,因此为16。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值