C语言第二十四弹---指针(八)

这篇具有很好参考价值的文章主要介绍了C语言第二十四弹---指针(八)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

指针

1、数组和指针笔试题解析

 1.1、字符数组

1.1.1、代码1:

1.1.2、代码2:

1.1.3、代码3:

1.1.4、代码4:

1.1.5、代码5:

1.1.6、代码6:

总结


1、数组和指针笔试题解析

 1.1、字符数组

   1.1.1、代码1:

char arr[] = {'a','b','c','d','e','f'};
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));

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"
printf("%d\n", sizeof(arr));

//数组名单独放在sizeof内部,代表整个数组,因此为6字节。
printf("%d\n", sizeof(arr+0));

//数组名表示首元素地址,+0还是首元素地址,实质是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(*arr));

//数组名为首元素地址,解引用为首元素,类型为char,因此大小为1字节。
printf("%d\n", sizeof(arr[1]));

//arr[1]为第二个元素,类型为char,因此大小为1字节。
printf("%d\n", sizeof(&arr));

//&arr为整个数组地址,但是实质还是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(&arr+1));

//&arr为整个数组地址,+1则走数组大小步,但是实质还是地址,在x64环境为8字节,x86环境为4字节。
printf("%d\n", sizeof(&arr[0]+1));

//arr[0]为第一个元素,&arr为第一个元素地址,+1则走char类型步,但是实质是地址,x64环境为8字节,x86环境为4字节。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

1.1.2、代码2:

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));

strlen计算的是'\0'之前的字符个数,参数为指针。

size_t strlen ( const char * str );

char arr[] = {'a','b','c','d','e','f'};

//单引号初始化的字符数组,有几个字符则实际存储几个字符,数组内容有"abcdef"
printf("%d\n", strlen(arr));

//arr为数组首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(arr+0));

//arr为数组首元素地址,arr+0还是首元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(*arr));

//arr为首元素地址,*arr为数组第一个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。
printf("%d\n", strlen(arr[1]));

//arr[1]为第二个元素,但是函数参数要求为指针,此处为char类型的值,因此该代码错误。
printf("%d\n", strlen(&arr));

//&arr为整个数组地址,但是该地址的值还是首元素地址的值,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(&arr+1));

//&arr为整个数组地址,+1则走整个数组大小步,但是我们并不知道'\0'的位置,因此该值为大于等于字符串长度6的随机值。
printf("%d\n", strlen(&arr[0]+1));

//&arr[0]为第一个元素地址,+1则为第二个元素地址,在数组初始化中没有'\0',但是strlen会一直执行,直到找到'\0'才停止计算,因此该值为大于等于字符串长度6的随机值。

注:想要得到结果,需要注释掉其中两个错误代码,否则会引发下面的异常。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

代码2运行结果及分析:

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

1.1.3、代码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));

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0。

//sizeof计算的是占用空间大小,大小为字节。
printf("%d\n", sizeof(arr));

//数组名arr单独放在sizeof内部代表整个数组大小,因此为7字节(\0占用一个字节)。
printf("%d\n", sizeof(arr+0));

//数组名arr不是单独放在sizeof内部,表示首元素地址,+0还是首元素地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(*arr));

//数组名arr不是单独放在sizeof内部,表示首元素地址,*arr为首元素,类型为char,因此为1字节。
printf("%d\n", sizeof(arr[1]));

//arr[1]为第二个元素,类型为char,因此为1字节。
printf("%d\n", sizeof(&arr));

//&arr为整个数组的地址,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(&arr+1));

//&arr为整个数组的地址,+1则走整个数组大小步,但是实质还是地址,在x86环境下为4字节,x64环境为8字节。
printf("%d\n", sizeof(&arr[0]+1));

//&arr[0]为首元素地址,+1则走一个char类型大小步,即为第二个元素地址,在x86环境下为4字节,x64环境为8字节。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

1.1.4、代码4:

char arr[] = "abcdef";
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));

char arr[] = "abcdef";

//双引号包裹的字符串在末尾会自动加'\0',因此字符串实际的内容有abcdef\0

//strlen计算的是'\0'之前的字符个数,需要包含头文件#include<string.h>

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

//数组名arr为数组首元素地址,首元素到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(arr+0));

//数组名arr为数组首元素地址,+0还是首元素地址,首元素到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(*arr));

//数组名arr为数组首元素地址,*arr为首元素,但是函数的参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(arr[1]));

//arr[1]为第二个元素,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(&arr));

//&arr为整个数组地址,地址的值为首元素地址的值,首元素到'\0'之间有6个元素,因此长度为6.
printf("%d\n", strlen(&arr+1));

//&arr为整个数组地址,+1则走整个数组大小步,此时不知道'\0'在什么位置,因此为随机值。
printf("%d\n", strlen(&arr[0]+1));

//&arr[0]为首元素地址,+1位第二个元素地址,第二个元素到'\0'之间有5个元素,因此长度为5。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

注:想要得到结果,需要注释掉其中两个错误代码。

1.1.5、代码5:

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));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址
printf("%d\n", sizeof(p));

//p为指针变量,指向第一个字符,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(p+1));

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(*p));

//p为指针变量,指向第一个字符,*p则为第一个字符,类型为char,因此为1字节。
printf("%d\n", sizeof(p[0]));

//p[0]为第一个字符,类型为char,因此为1字节。
printf("%d\n", sizeof(&p));

//p为指针变量,指向第一个字符,&p为指针变量的地址,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(&p+1));

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,x64环境大小为8字节,x86环境为4字节。
printf("%d\n", sizeof(&p[0]+1));

//&p[0]为第一个字符的地址,+1位第二个字符的地址,x64环境大小为8字节,x86环境为4字节。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

1.1.6、代码6:

char *p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));

char *p = "abcdef";//此处为字符常量

//p为指针变量,指向字符常量的首元素地址

printf("%d\n", strlen(p));

//p为指针变量,指向第一个字符,第一个字符到'\0'之间有6个元素,因此长度为6。
printf("%d\n", strlen(p+1));

//p为指针变量,p+1同样为指针变量,走char类型大小步,指向第二个字符,第二个字符到'\0'之间有5个元素,因此长度为5。
printf("%d\n", strlen(*p));

//p为指针变量,指向第一个字符,*p则为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(p[0]));

//p[0]为第一个字符,但是函数参数为指针,参数不匹配,因此该代码错误。
printf("%d\n", strlen(&p));

//p为指针变量,指向第一个字符,&p为指针变量的地址,该地址到'\0'之间不知道有几个元素,因此为随机数。
printf("%d\n", strlen(&p+1));

//p为指针变量,指向第一个字符,&p为指针变量的地址,&p+1同样为地址,该地址到'\0'之间不知道有几个元素,因此为随机数。
printf("%d\n", strlen(&p[0]+1));

//&p[0]为第一个字符的地址,+1位第二个字符的地址,第二个字符到'\0'之间有5个元素,因此长度为5。

C语言第二十四弹---指针(八),C语言详解,算法,c语言,开发语言

 数组名的意义:

1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3. 除此之外所有的数组名都表示首元素的地址。

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!文章来源地址https://www.toymoban.com/news/detail-830327.html

到了这里,关于C语言第二十四弹---指针(八)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第二十四章 Unity 纹理贴图

    通常情况下,3D网格模型只能展示游戏对象的几何形状,而表面的细节则纹理贴图提供。纹理贴图通过UV坐标“贴附”在模型的表面。当然,这个过程不需要我们在Unity中完成,而是在建模软件中完成的。通常情况下,我们通过3ds max或者maya制作完网格模型后,需要进行一个“

    2024年02月05日
    浏览(27)
  • 第二十四节 连接到OneNET

    有了前面两个实验的经验,废话不多说,直接使用OneNET。 首先注册与登陆OneNET,然后进入开发者中心:https://open.iot.10086.cn/develop/global/product/#/public,选择公有协议产品,点击“添加产品”,填写产品相关的信息,联网方式选择wifi(其实我们是以太网,但是没有这个选项,那

    2024年02月05日
    浏览(49)
  • 第二十四章:索引的数据结构

    ​ 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。 MySQL 中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则 通过索引查找 相关数据,如果

    2024年02月15日
    浏览(35)
  • Java多线程&并发篇----第二十四篇

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 采用时间片轮转的方式。可以设置线程的优先级,会映射到下层的系统上

    2024年01月20日
    浏览(35)
  • 二十三种设计模式第二十四篇--访问者模式(完结撒花)

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。 通过这种方式,元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的

    2024年02月14日
    浏览(33)
  • 【从零开始学JAVA | 第二十四篇】单列集合的遍历

    目录 前言: 单列集合的遍历方式: 迭代器遍历: 增强for遍历: lambda方法遍历:  总结: 本篇我们会讲解关于单列集合的几种遍历方式,遍历集合可以说是对于集合要求掌握的最低技能,因此我们要熟练的掌握遍历集合的方式。 在这里我们不讲for循环遍历,for循环无法对单

    2024年02月16日
    浏览(37)
  • Kafka 知识点学习【Kafka 学习之24问-第二十四刊】

    🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论⭐收藏 Kafka知识专栏学习 Kafka知识云集 访问地址 备注 Kafka知识点(1) https://blog.csdn.net/m

    2024年02月05日
    浏览(34)
  • 学C的第二十六天【指针的进阶(二)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十五天【指针的进阶(一)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月13日
    浏览(37)
  • 学C的第二十七天【指针的进阶(三)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第二十六天【指针的进阶(二)】_高高的胖子的博客-CSDN博客  ================================

    2024年02月16日
    浏览(32)
  • 学C的第二十五天【指针的进阶(一)】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com) =========================================================================  接上期 : 学C的第二十四天【练习】-CSDN博客  =========================================================================  

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包