【指针和数组笔试题(1)】详解指针、数组笔试题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在计算之前要了解基本概念:

数组名的理解
数组名是数组首元素的地址
有两个例外
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组中的大小,单位是字节。
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址


整型数组

#include<stdio.h>

int main()
{
	int a[] = { 1,2,3,4 };
	
	printf("%d\n", sizeof(a));

a是数组名,数组名单独放在sizeof内部,计算的是整个数组的大小,4*4=16,size(a)大小是16个字节

printf("%d\n", sizeof(a + 0));

数组名a是数组首元素地址,a+0还是数组首元素地址,是地址就是4/8个字节

printf("%d\n", sizeof(*a));

*a=a[0],数组名a是数组首元素地址,*a就是首元素,求的是大小不是地址,整型的大小是4个字节

printf("%d\n", sizeof(a + 1));

数组名a是数组首元素地址,a+1是数组第二个元素地址,是地址就是4/8个字节

printf("%d\n", sizeof(a[1]));

a[1] = (a + 1),a是数组首元素地址,a+1是数组第二个元素地址,(a+1)就是第二个元素,就是求大小,整型数组大小就是4个字节。

printf("%d\n", sizeof(&a));

&a取出的是整个数组的地址,是地址就是4/8个字节

printf("%d\n", sizeof(*&a));

sizeof(*&a)=sizeof(a),这里的a表示整个数组,计算的是整个数组中的大小,单位是字节。4 * 4=16

printf("%d\n", sizeof(&a + 1));

&a表示整个数组的地址,&a+1表示跳过整个元素,依然是地址,是地址就是4/8个字节

printf("%d\n", sizeof(&a[0]));

&a[0]是数组首元素地址,4/8个字节

printf("%d\n", sizeof(&a[0] + 1));

&a[0]是数组首元素地址,&a[0] + 1就是数组第二个元素的地址,4/8个字节

	return 0;

}

在x64的环境下就是8个字节,在x86环境下就是4个字节
通常使用的是x86环境
在这里插入图片描述

在这里插入图片描述

字符数组

第一组题

int main()
{
	char arr[] = { 'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));

arr单独放在sizeof内部,计算的是整个数组的大小,char类型的数组,单位是一个字节,1*6=6

printf("%d\n", sizeof(arr+0));

arr表示数组首元素地址,arr+0依旧是首元素的地址,是地址,就是4/8个字节

printf("%d\n", sizeof(*arr));

arr表示数组首元素地址,*arr表示首元素,注意计算的不是地址,是大小,首元素的大小是1个字节

printf("%d\n", sizeof(arr[1]));

arr[1]=*(arr+1),arr[1]表示第二个元素,注意计算的不是地址,是大小,第二个元素得大小是1个字节

printf("%d\n", sizeof(&arr));

&arr是整个数组的地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr+1));

&arr是整个数组的地址,&arr+1表示跳过整个数组,依旧表示地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr[0]+1));

&arr[0]是首元素的地址,&arr[0]+1是第二个元素的地址,是地址就是4/8个字节

	return 0;
}

在这里插入图片描述


第二组题

strlen是库函数
作用是求字符串长度,统计的是在字符串中\0之前的字符的个数
如果没有\0就会一直往后找

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));

因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后统计字符串长度,产生的结果是随机值
printf(“%d\n”, strlen(arr + 0));
//arr是首元素地址,arr+0还是首元素地址, 和第一个一样,还是随机值

printf("%d\n", strlen(*arr));
//错误代码

arr是数组首元素地址,*arr是数组首元素,就是’a’,'a’的ASCII码值是97,
strlen函数参数需要传地址,那就是将97作为地址传给strlen,strlen就从97这个地址往后统计字符串长度,这就非法访问内存了

//错误代码
printf("%d\n", strlen(arr[1]));

arr[1]是数组第二个元素,‘b’,访问的是’b’的ASCII码值是98,所以也是错误代码

printf("%d\n", strlen(&arr));

&arr是数组的地址,数组的地址和首元素的地址一样,所以传递给strlen函数后,依然是从数组的第一个元素向后统计字符串长度,随机值

printf("%d\n", strlen(&arr + 1));

&arr是首元素地址,&arr+1跳过整个数组,从数组最末端向后统计字符串长度,结果也是随机值

printf("%d\n", strlen(&arr[0] + 1));

&arr[0] + 1是第二个元素地址,strlen从第二个元素地址向后统计字符串长度,结果也是随机值

	return 0;
}

在这里插入图片描述


第三组题

int main()
{
	char arr[] = "abcdef";//里面实际放有[a b c d e f \0]
printf("%d\n", sizeof(arr));

arr单独放在sizeof里面,计算的是整个数组的大小,单位是字节,
char类型的数组,单位是一个字节,1*7=7,结果是7个字节

printf("%d\n", sizeof(arr+0));

arr表示首元素地址,arr+0还是表示首元素地址,是地址,就是4/8个字节

printf("%d\n", sizeof(*arr));//*arr=*(arr+0)=arr[0]

arr表示首元素的地址,*arr表示首元素,数组类型是char类型,单位是一个字节,所以首元素的大小是一个字节

printf("%d\n", sizeof(arr[1]));

arrp[1]表示第二个元素,大小是一个字节

printf("%d\n", sizeof(&arr));

&arr表示整个数组地址,地址是4、8个字节

printf("%d\n", sizeof(&arr+1));

&arr表示整个数组地址,&arr+1表示跳过整个数组,依然是地址,是地址就是4/8个字节

printf("%d\n", sizeof(&arr[0]+1));

&arr[0]表示首元素地址,&arr[0]+1表示第二个元素地址,是地址就是4/8个字节

		return 0;
}

在这里插入图片描述

总结

以上就是第一部分的指针和数组笔试题和详细解释。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值