指针与数组题目分析

目录

一维数组

题目

运行结果

答案

题解

字符数组

题目

sizeof

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

运行结果

sizeof

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

答案

sizeof

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

题解

sizeof

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen

单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

二维数组

题目

运行结果

答案

题解

结尾


一维数组

题目

请先自己将题目分析完

运行结果

答案

题解

1.a,在sizeof函数内部单独出现的数组名,表示的不再是数组首元素地址,而是整个数组,计算的是整个数组的大小 4 * 4 = 16个字节(sizeof(数组名)数组名表示整个数组,计算的是整个数组的大小)

2.a+0,此处数组名代表首元素地址,+0依旧表示首元素地址,地址的大小为 4 / 8个字节

3.*a,此处数组名代表首元素地址,解引用为数组首元素,即为4个字节

4..a+1,此处数组名代表首元素地址,地址+1指向数组第二个元素,即为4个字节

5.a[1],代表数组第二个元素,为4个字节

6.&a,此处取出数组地址,即为4/8个字节(&(数组名)取出的是整个数组的地址,不是首元素地址)

7.*&a,*与&符号互相消去(就像+和-)故此处为数组地址,即为16个字节

8.&a+1,取出a数组的地址并+1,跳过整个数组,但它只要是地址,大小就为4/8个字节

9.&a[0],取出数组首元素地址,是地址,大小为4/8个字节

10.&a[0]+1,取出数组首元素地址并+1指向数组第二个元素,是地址,大小为4/8个字节

字符数组

题目
sizeof
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

运行结果
sizeof
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

答案
sizeof
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

strlen
单个存放字符

连续存放字符

字符串常量首字符地址赋值给指针变量p

题解
sizeof
单个存放字符

1.sizeof(arr),sizeof函数内部单独存放数组名,计算的是整个数组的大小1 * 6 = 6个字节

2.sizeof(arr+0),sizeof内部存放数组首元素地址+1,指向数组第二个元素,是地址,即为4/8个字节

3.*arr,对数组首元素地址解引用为数组首元素,即为1个字节

4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节

5.&arr,取出整个数组的地址,是地址,即为4/8个字节

6.&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节

7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节

连续存放字符

1.sizeof(arr),sizeof函数内部单独存放数组名,计算的是整个数组的大小,因为这里是连续存放,在字符串末尾还有一个'\0',故为1 * 7 = 7个字节

2..sizeof(arr+0),sizeof内部存放数组首元素地址+1,指向数组第二个元素,是地址,即为4/8个字节

3.*arr,对数组首元素地址解引用为数组首元素,即为1个字节

4..arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节

5..&arr,取出整个数组的地址,是地址,即为4/8个字节

6..&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节

7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节

字符串常量首字符地址赋值给指针变量p

1.p,是一个指针变量,即为4/8个字节

2.p+1,字符串首元素地址+1表示第二个元素的地址,是地址,即为4/8个字节

3.*p,对字符串首元素地址解引用为字符串首元素,即为1个字节

4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,即为1个字节

5.&arr,取出整个数组的地址,是地址,即为4/8个字节

6.&arr+1,取出整个数组的地址+1,跳过整个数组,但还是地址,即为4/8个字节

7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,是地址,即为4/8个字节

strlen
单个存放字符

1.strlen(arr),arr为数组首元素地址,strlen计算'\0'之前有效字符个数,因为字符单个存放,'\0'不确定出现在什么位置,故为随机值

2.strlen(arr+0),arr+0为数组首元素地址,strlen计算'\0'之前有效字符个数,因为字符单个存放,'\0'不确定出现在什么位置,故为随机值

3.*arr,对数组首元素地址解引用为数组首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问

4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,strlen的参数为地址,将数组第二个元素的ASCII码值当作地址,非法访问

5.&arr,取出整个数组的地址(此处也可称呼为数组首元素地址,因为数组地址和数组首元素地址的值是相同的,不过类型不同,这里用不到类型的概念,故相同),将数组内所有元素计算在内,'\0'不确定出现在什么位置,故为随机值

6.&arr+1,取出整个数组的地址+1,跳过整个数组,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,但又因为跳过数组arr,故为随机值-6

7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,故为随机值-1

连续存放字符

1.strlen(arr),arr为数组首元素地址,strlen计算'\0'之前有效字符个数,因为这里是连续存放,在字符串末尾还有一个'\0',故为6

2.strlen(arr+0),arr+0为数组首元素地址,strlen计算'\0'之前有效字符个数,因为这里是连续存放,在字符串末尾还有一个'\0',故为6

3.*arr,对数组首元素地址解引用为数组首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问

4.arr[1],对arr数组下标为一的元素的地址解引用为数组第二个元素,strlen的参数为地址,将数组第二个元素的ASCII码值当作地址,非法访问

5.&arr,取出整个数组的地址(此处也可称呼为数组首元素地址,因为数组地址和数组首元素地址的值是相同的,不过类型不同,这里用不到类型的概念,故相同),将数组内所有元素计算在内,在字符串末尾还有一个'\0',故为6

6.&arr+1,,取出整个数组的地址+1,跳过整个数组,然后开始计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,但又因为跳过数组arr,故为随机值

7.&arr[0]+1,取出数组首元素地址+1,跳过一个数组元素指向数组第二个元素,然后开始计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为5

字符串常量首字符地址赋值给指针变量p

1.p,是一个指针变量,存储数组首元素地址,计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为6

2.p+1,字符串首元素地址+1指向第二个元素,计算'\0'之前的有效字符个数,故为5

3.对字符串首元素地址解引用为数组串首元素,strlen的参数为地址,将数组首元素的ASCII码值当作地址,非法访问

4.对字符串首元素下标为0的元素的地址解引用为数组第1个元素,strlen的参数为地址,将数组第1个元素的ASCII码值当作地址,非法访问

5.&p,取出p的地址而不是字符串首元素地址,计算'\0'之前的有效字符个数,'\0'不确定出现在什么位置,故为随机值

6.&(p+1),取出p的地址+1,跳过一个char*p大小的空间,因为不确定里面是否有'\0',故值与5的值无关系,故为随机值

7.&p[0]+1,取出字符串首元素地址+1,跳过一个元素,计算'\0'之前的有效字符个数,在字符串末尾还有一个'\0',故为5

二维数组

题目

运行结果

答案

题解

1.sizeof(a),sizeof函数内部单独存放数组名,计算的是整个数组的大小,即为48个字节

2.a[0][0],为数组第一行第一列元素,即为4个字节

3.a[0],为数组第一行首元素地址,单独存放在sizeof函数内部,计算的是第一行所有元素的大小,即为4*4=16个字节

4.a[0]+1,a[0]为第一行首元素地址,+1为第一行第2列元素地址,是地址,即为4/8个字节

5.*(a[0]+1),a[0]为第一行首元素地址,+1为第一行第2列元素地址,解引用为数组第一行第二列的元素,即为4个字节

6.a+1,a为数组第一行地址,+1为数组第二行地址,是地址,即为4/8个字节

7.*(a+1),a为数组第一行地址,+1为数组第二行地址,解引用为数组第二行元素,即为4*4=16个字节

8.&a[0]+1,取出数组第一行地址,+1为数组第二行地址,是地址,即为4/8个字节

9.*(&a[0]+1),取出数组第一行地址,+1为数组第二行地址,解引用为数组第二行元素,即为4*4=16个字节

10.*a,解引用数组第一行地址,即为4*4=16个字节

11.a[3],看似a[3]越界访问,但是却可以正常输出16,因为sizeof内部不会真正进行计算,sizeof会根据参数类型推断而出,故a[3]为16个字节

结尾

感谢认真观看完全文,如有发现错误,请指出,作者校正后会加以改正

最后,祝各位道友早日突破/进阶

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值