【C语言进阶】经典笔试题数组篇之一维数组详解_c语言中数组的简答题(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • char arr[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
  1. printf(“%d\n”,sizeof(arr);
    解:计算的是字符数组的大小,为6;
  2. printf(“%d\n”,sizeof(arr+0);
    解:计算的是数组第一个元素地址大小,4/8;
  3. printf(“%d\n”,sizeof(*arr);
    解:计算的是数组首元素大小,为1字节;
  4. printf(“%d\n”,sizeof(arr[1]);
    解:计算数组第二个元素大小,1字节;
  5. printf(“%d\n”,sizeof(&arr);
    解:计算的是整个数组的大小,为4/8;
  6. printf(“%d\n”,sizeof(&arr+1);
    解:计算的是整个数组+1后的地址大小,为4/8;
  7. printf(“%d\n”,sizeof(&arr[0]+1);
    解:计算的是第二个元素地址大小,4/8;

代码块③:

char arr[] = { 'a','b','c','d','e','f' };
	printf("① %d\n", strlen(arr));
	printf("② %d\n", strlen(arr + 0));
	printf("③ %d\n", strlen(\*arr));
	printf("④ %d\n", strlen(arr[1]));
	printf("⑥ %d\n", strlen(&arr));
	printf("⑦ %d\n", strlen(&arr + 1));
	printf("⑧ %d\n", strlen(&arr[0] + 1));

结果:

在这里插入图片描述

解析:

  1. printf(“%d\n”,strlen(arr));
    解:随机值,因为我们知道strlen()函数计算字符串,是以\0结束;如果扫描不到\0,它就会一直在内存中扫描下去,直到遇见\0为止;
  2. printf(“%d\n”,strlen(arr+0));
    解:随机值,同上;
  3. printf(“%d\n”,strlen(arr));
    解:我们知道,库函数strlen()它的参数是一个字符指针,如int strlen(const char
    str);而*arr表示对字符数组首元素解引用,即是访问’a’字符,而我们又知道’a’字符在内存中表示为ASCLL码,为97,而97这个数组传给strlen()函数时,它会把它当成一个地址来访问,我们也不知道地址97里放的啥,会报错。
  4. printf(“%d\n”,strlen(arr[1]));
    解:arr[1]表示字符’b’,分析同上,报错;
  5. printf(“%d\n”,strlen(&arr));
    解:传字符数组地址,得到是随机值,strlen()扫描数组时,找不到\0,会一直找下去;
  6. printf(“%d\n”,strlen(&arr+1));
    解:随机值;扫描字符数组后的地址内容,我们不知道字符数组后面地址的存储内容,但是这个随机值和strlen(&arr)的随机值是相差6字节的;
  7. printf(“%d\n”,strlen(&arr[0]+1));
    解:随机值,传给strlen()的是字符’b’的地址;

关于库函数strlen()的定义:

  • 它是用来求字符串长度的,形参设置为一个char类型的指针,所以我们传参的时候都是传的都是地址,而srtrlen()收到一个地址后,将会从这个地址以每次访问一个字节的空间大小,开始一直扫描,直到扫描到\0后停止;在这里插入图片描述

2.3字符串数组

代码块③:

char arr[] = "abcdef";
	printf("① %d\n", sizeof(arr));
	printf("② %d\n", sizeof(arr + 0));
	printf("③ %d\n", sizeof(\*arr));
	printf("④ %d\n", sizeof(arr[1]));
	printf("⑤ %d\n", sizeof(&arr));
	printf("⑥ %d\n", sizeof(&arr + 1));
	printf("⑦ %d\n", sizeof(&arr[0] + 1));
	printf("⑧ %d\n", strlen(arr));
	printf("⑨ %d\n", strlen(arr + 0));
	printf("⑩ %d\n", strlen(\*arr));
	printf("11 %d\n", strlen(arr[1]));
	printf("12 %d\n", strlen(&arr));
	printf("13 %d\n", strlen(&arr + 1));
	printf("14 %d\n", strlen(&arr[0] + 1));

结果:

在这里插入图片描述

解析:

  • 字符串在内存中存放图解:
  • char arr[]=“abcdef”;
  1. printf(“%d\n”,sizeof(arr));
    解:sizeof()计算字符串长度时会把字符串后面自带的\0计算进去,所以为7字节;
  2. printf(“%d\n”,sizeof(arr+0));
    解:计算首元素地址,4/8字节
  3. printf(“%d\n”,sizeof(*arr));
    解:计算首元素大小,1字节;
  4. printf(“%d\n”,sizeof(arr[1]));
    解:计算第二个元素大小,1字节;
  5. printf(“%d\n”,sizeof(&arr));
    解:计算整个数组的地址,4/8;
  6. printf(“%d\n”,sizeof(&arr+1));
    解:计算字符串数组之后的地址大小,4/8
  7. printf(“%d\n”,sizeof(&arr[0]+1));
    解:计算第二个元素的地址大小,4/8
  8. printf(“%d\n”,strlen(arr))
    解:strlen计算字符串长度,遇到字符串后\0,停止;字符数组arr大小为6字节;
  9. printf(“%d\n”,strlen(arr+0))
    解:arr+0表示首元素地址,但我们知道strlen要遇到\0才停止,所以会扫描完整个字符数组,结果为6字节;
  10. printf(“%d\n”,strlen(*arr))
    解:报错;
  11. printf(“%d\n”,strlen(arr[1]))
    解:报错;
  12. printf(“%d\n”,strlen(&arr))
    解:6字节,我们知道strlen的形参为char*类型,即字符指针,每次访问一个字节,当我们传&arr整个字符数组的地址给strlen时,它会从这个地址开始,一个字节一个字节的往后访问,直到遇到\0为止,它不会以整个字符数组的大小来访问;
  13. printf(“%d\n”,strlen(&arr+1))
    解:随机值;字符数组后的内存空间我们不知道具体存放内容
  14. printf(“%d\n”,strlen(&arr[0]+1))
    解:大小为5;从字符数组第二个元素开始扫描,直到遇到\0;

代码块④:

char\* p = "abcdef";
	printf("① %d\n", sizeof(p));
	printf("② %d\n", sizeof(p + 1));
	printf("③ %d\n", sizeof(\*p));
	printf("④ %d\n", sizeof(p[0]));
	printf("⑤ %d\n", sizeof(&p));
	printf("⑥ %d\n", sizeof(&p + 1));
	printf("⑦ %d\n", sizeof(&p[0] + 1));
	printf("⑧ %d\n", strlen(p));
	printf("⑨ %d\n", strlen(p + 1));
	printf("⑩ %d\n", strlen(\*p));
	printf("11 %d\n", strlen(p[0]));
	printf("12 %d\n", strlen(&p));
	printf("13 %d\n", strlen(&p + 1));
	printf("14 %d\n", sizeof(&p[0] + 1));

结果:

在这里插入图片描述

解析:
charp = “abcdef”//把字符串首地址放到指针p里;
图解:在这里插入图片描述

  1. printf(“%d\n”,sizeof§);
    解:计算首地址大小,4/8
  2. printf(“%d\n”,sizeof(p+1));
    解:计算第二个元素地址大小,4/8
  3. printf(“%d\n”,sizeof(*p));
    解:计算第一个元素大小,1
  4. printf(“%d\n”,sizeof(p[0]));
    解:计算第一个元素大小,1
  5. printf(“%d\n”,sizeof(&p));
    解:计算指针地址大小,4/8
  6. printf(“%d\n”,sizeof(&p+1));
    解:计算指针地址+1后的地址大小,4/8
  7. printf(“%d\n”,sizeof(&p[0]+1));
    解:计算第二个元素地址大小,4/8
  8. printf(“%d\n”,strlen§);
    解:大小为6;p是指针,存放的是字符串首元素的地址,传参给strlen的是首元素的地址,strlen函数就会找到第一个元素,并从第一个元素向后扫描,直到遇到\0后结束;
  9. printf(“%d\n”,strlen(p+1));
    解:大小为5;p+1表示的是字符串第二个元素的地址,strlen会找到第二个元素,并从第二个元素开始扫描,直到遇见\0为止;
  10. printf(“%d\n”,strlen(*p));

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

…(img-JzzTcjeB-1715852846665)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值