带你深入了解C语言指针(五)

目录

  • 前言
  • 一、数组和指针笔试题解析
    • 1.整型数组
    • 2.字符数组
      • 2.1 sizeof
      • 2.2strlen()
        • 2.2.1字符数组
        • 2.2.2字符串
        • 2.2.3字符串指针
        • 2.2.4二维数组
  • 总结


前言

前面我们已经讲指针的主要知识学完了,这期我们主要进行一些题目的分析;话不多说,正文开始。


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

sizeof操作符和strlen函数对比

1.整型数组

int main()
{int a[] = { 1,2,3,4 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a + 0));printf("%zd\n", sizeof(*a));printf("%zd\n", sizeof(a + 1));printf("%zd\n", sizeof(a[1]));printf("%zd\n", sizeof(&a));printf("%zd\n", sizeof(*&a));printf("%zd\n", sizeof(&a + 1));printf("%zd\n", sizeof(&a[0]));printf("%zd\n", sizeof(&a[0] + 1));return 0;
}

分析:
sizeof(a):我们前面就已经说过了,数组名一般都表示数组首元素的地址,但是有两个例外:

  • sizeof(数组名):数组名表示整个数组,计算的是整个数组的大小,单位是字节;
  • &数组名:数组名表示整个数组首元素的地址;

sizeof(a + 0):这里的a可不是表示数组名字了,这里可以理解为指针与整数加法运算,表示首元素地址,类型是int*;4/8;
sizeof(*a): a是首元素地址,*a就是首元素了,大小是4个字节;*a = a[0] = *(a + 0)

sizeof(a+1): 与sizeof(a+0)一致;
sizeof(&a): 还是地址,4/8;
sizeof(*&a): 相互抵消:16;
sizeof(&a + 1):还是地址;
sizeof(&a[0]):同理还是地址;
sizeof(&a[0] + 1):同理;地址;
运行结果:
在这里插入图片描述

2.字符数组

2.1 sizeof

int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));printf("%zd\n", sizeof(*arr));printf("%zd\n", sizeof(arr[1]));printf("%zd\n", sizeof(&arr));printf("%zd\n", sizeof(&arr + 1));printf("%zd\n", sizeof(&arr[0] + 1));return 0;
}

分析:
这里与上面所讲一摸一样,这里直接给出结果(×64):

在这里插入图片描述

2.2strlen()

我们将所有的sizeof换成strlen结果会怎么变呢?

2.2.1字符数组
#include <string.h>
int main()
{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));return 0;
}

分析:
strlen(arr): arr首元素地址,数组中没有\0,会导致越界访问,结果就是随机的
strlen(arr + 0):arr+0首元素地址,与第一个一致;
strlen(*arr):这题相当于传进一个‘a’,a的ASCII值为97,97为地址来计算字符串长度,不允许访问;
在这里插入图片描述
strlen(arr[1]): 与上面一样,无法访问;
strlen(&arr):&arr是数组的地址,起始位置是数组的第一个元素的位置,随机值;
strlen(&arr + 1):&arr跳过一个数组后,也是随机值;
strlen(&arr[0] + 1):从第二个元素向后统计;
运行结果:
在这里插入图片描述

2.2.2字符串
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));printf("%zd\n", sizeof(*arr));printf("%zd\n", sizeof(arr[1]));printf("%zd\n", sizeof(&arr));printf("%zd\n", sizeof(&arr + 1));printf("%zd\n", sizeof(&arr[0] + 1));return 0;
}

分析:这里我们要注意字符数组里面有几个元素:
在这里插入图片描述
所以sizeof(arr)计算的结果就是7
sizeof(arr+0)这里表示的是首元素的地址,是指针类型,4/8
sizeof(*arr)表示首元素,是char类型:1
sizeof(arr[1])是第二个元素:1
sizeof(&arr) 是数组地址:4/8
sizeof(&arr+ 1)跳过了一个数组,还是地址:4/8
sizeof(&arr[0] +1:第二个元素的地址:4/8
运行结果:
在这里插入图片描述
同样,我们换成strlen()

int main()
{char arr[] = "abcdef";printf("%zd\n", strlen(arr));printf("%zd\n", strlen(arr + 0));printf("%zd\n", strlen(*arr));printf("%zd\n", strlen(arr[1]));printf("%zd\n", strlen(&arr));printf("%zd\n", strlen(&arr + 1));printf("%zd\n", strlen(&arr[0] + 1));return 0;
}

对于strlen函数,我们要关注:\0:
strlen(arr):arr:是表示字符数组首元素的地址:6
strlen(arr + 0):表示数组首元素地址:6
strlen(*arr):表示首元素,‘a’->97,非法访问
strlen(arr[1]):与上面一致
strlen(&arr):数组地址:也是从第一个元素开始向后找:6
strlen(&arr + 1):跳过一个数组,越界访问;
strlen(&arr[0] + 1):跳过一个元素,从第二个元素开始计算:5
在这里插入图片描述
运行结果:
在这里插入图片描述

2.2.3字符串指针
int main()
{char* p = "abcdef";printf("%zd\n", sizeof(p));printf("%zd\n", sizeof(p + 1));printf("%zd\n", sizeof(*p));printf("%zd\n", sizeof(p[0]));printf("%zd\n", sizeof(&p));printf("%zd\n", sizeof(&p + 1));printf("%zd\n", sizeof(&p[0] + 1));return 0;
}

分析:
sizeof§:p是个指针变量,我们计算的是指针变量的大小:4/8;
sizeof(p+1):同理,p+1还是一个指针:4/8;
sizeof(*p):第一个字符:a–>char类型:1
sizeof(p[0]):两种理解方式:

  • p[0] —> *(p + 0)—>a
  • p是指向a的地址,把它当成数组名字来理解;即第一个元素:a

结果:1;
sizeof(&p):本质还是地址:4/8;
sizeof(&p + 1):跳过p指针变量的地址:4/8;
在这里插入图片描述
sizeof(&a[0] + 1):本质还是地址:4/8;
运行结果:
在这里插入图片描述

同样,我们将其换成strlen:

int main()
{char* p = "abcdef";printf("%zd\n", strlen(p));printf("%zd\n", strlen(p + 1));printf("%zd\n", strlen(*p));printf("%zd\n", strlen(p[0]));printf("%zd\n", strlen(&p));printf("%zd\n", strlen(&p + 1));printf("%zd\n", strlen(&p[0] + 1));return 0;
}

分析:
strlen§:6;
strlen(p+1):5;
在这里插入图片描述
strlen(*p):*p ->‘a’->97->非法访问err
strlen(arr[0]):与上一个一致;都是表示第一个元素:‘a’->97->非法访问err
strlen(&p):取指针变量p的地址,与字符串长度没什么关系;可能会出来一个随机值;
strlen(&p+ 1):与&p一样,只是跳过了一个char*类型的长度;
在这里插入图片描述
strlen(&a[0]+1):从第二个元素开始:5;

运行结果:
在这里插入图片描述

2.2.4二维数组
int main()
{int a[3][4] = { 0 };printf("%d\n", sizeof(a));printf("%d\n", sizeof(a[0][0]));printf("%d\n", sizeof(a[0]));printf("%d\n", sizeof(a[0] + 1));printf("%d\n", sizeof(*(a[0] + 1)));printf("%d\n", sizeof(a + 1));printf("%d\n", sizeof(*(a + 1)));printf("%d\n", sizeof(&a[0] + 1));printf("%d\n", sizeof(*(&a[0] + 1)));printf("%d\n", sizeof(*a));printf("%d\n", sizeof(a[3]));return 0;
}

创建了一个二维数组:
在这里插入图片描述
sizeof(a):a是数组名,单独放在sizeof的内部,计算的是数组的大小:344=48;
sizeof(a[0][0]:第一行第一个元素:4个字节;
sizeof(a[0]):
我们将二维数组看成一个一维数组,将每一行都看成一维数组的元素,所以这里就不难理解了,a[0]数组名单独放在sizeof,表示一维数组的总大小:16;
在这里插入图片描述
sizeof(a[0]+1):a[0]是第一行的数组名,但是a[0]并没有单独放在sizeof的内部,所以这里的数组名,就是数组首元素地址,所以表示a[0][1]地址:4/8字节;
在这里插入图片描述
sizeof(*(a[0]+1)):同上,表示a[0][1]int 类型:4字节;
sizeof(a+1):a作为数组名并没有单独放在sizeof内,a表示数组首元素的地址,是二维数组首元素的地址,也就是第一行的地址:4/8字节;
在这里插入图片描述
sizeof(*(a+1)):

  • a+1是第二行地址,*(a+1)就是第二行,计算的是第二行的大小:16
  • *(a+1) = a[1],a[1]是第二行数组名,相当于sizeof(a[1]):16字节

sizeof(&a[0]+1):a[0]是第一行的数组名,&a[0]取出的就是数组的地址,也就是第一行地址,+1也就是第二行地址:4/8;
sizeof(*(&a[0]+1)):对第二行地址进行解引用,访问的就是第二行,大小是16字节;
sizeof(*a):a作为数组名并没有单独放在sizeof内,a表示数组的首元素地址;*a就表示第一行,计算的就是第一行的大小:16字节;
sizeof(a[3]):虽然是越界了,但是本质是地址:4/8;


总结

这期我们主要进行题目的讲解,相信大家看完一定有收获,加油!路上不止你我。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143440.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA操作Itext向pdf模板中填充数据,图片,复选框!

第一步模板制作&#xff1a; 在word中先把模板画好&#xff0c;另存为pdf&#xff0c;具体步骤为&#xff1a;wps—》工具------》开发工具。如图所示 图片也是设置为文本域&#xff0c;千万不要设置为图片域&#xff0c;否则图片会被覆盖&#xff01; 图片也是设置为文本域&a…

攻防世界---->流浪者

做题笔记。 下载 查壳。 32ida打开。 程序运行状态&#xff1a; 一开始以为&#xff0c;&#xff0c;&#xff0c;base62 去解密 不对。。哈哈哈。 跟进看看。 动调一下发现&#xff0c;input不在这个函数里面。 对函数进行跟踪。 逆推就好。 先通过密文&#xff0c;逆推密文…

动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;rerank模型微调实践 bge-reranker-v2-m3动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…

国家标准参编周期一般是多久?参编的流程有哪些?

在当今快速发展的时代&#xff0c;标准的重要性日益凸显。国家标准作为规范行业发展、保障产品质量、促进技术进步的重要依据&#xff0c;吸引着众多企业积极参与其中。而国家标准参编&#xff0c;为企业提供了一个提升自身竞争力、展示技术实力的良好平台。那么&#xff0c;国…

SLAM面经1(百度)

百度面经 百度共三面,如果面试效果俱佳,会增加一个hr面。前二面主要是技术面,分为在线coding+代码知识+专业知识+工程能力。第三面是主管面,偏向于管理方面,和hr面相似。 一面 1)在线coding 在线coding的考试内容为下面力扣的变种。 2)专业面 (1)VINS-FUSION与ORB…

佰朔资本:本周2只新股发行!水性印花胶浆细分龙头将登陆A股

到发稿&#xff0c;本周网上发行2只新股披露发行价。北交所新股铜冠矿建发行价为4.33元&#xff0c;发行市盈率15.48倍&#xff0c;工作最近一个月平均动态市盈率5.89倍。创业板新股长联科技发行价为21.12元&#xff0c;发行市盈率17倍&#xff0c;工作最近一个月平均动态市盈率…

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!

通过前面几期的学习&#xff0c;同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外&#xff0c;还具有丰富的扩展功能&#xff0c;比如&#xff1a;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期…

我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆

本教程基于自研的AI工具箱Tauri版进行VideoReapeat视频解说复述克隆。 视频解说复述克隆样片 《我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆》样片 进入软件后可以直接搜索 VideoReapeat 或者依次点击 Python音频技术/视频tools 进入该模块。 该模块会消耗TTS文本转语…

P1079 [NOIP2012 提高组] Vigenère 密码------------------------------P1703 那个什么密码2

P1079 [NOIP2012 提高组] Vigenre 密码 题目描述 16 世纪法国外交家 Blaise de Vigenre 设计了一种多表密码加密算法 Vigenre 密码。Vigenre 密码的加密解密算法简单易用&#xff0c;且破译难度比较高&#xff0c;曾在美国南北战争中为南军所广泛使用。 在密码学中&#xff…

人工智能(AI)的影响下人类的生活样子

讨论在人工智能(AI)的影响下人类的生活是什么样子 在21世纪的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来科技&#xff0c;而是悄然渗透到我们日常生活的每一个角落&#xff0c;以一种前所未有的方式改变着我们的生活方式、工作模式乃至社会…

在表格的函数参数中使用通配符

条件&#xff1a;条件的形式为数字、表达式、单元格引用或文本&#xff0c;它定义了要计数的单元格范围。 例如&#xff0c;条件可以表示为32、">32"、B4、"apples"或"32"。 可以在条件中使用通配符&#xff0c;即问号(?)和星号(*)。问号匹…

Python编码系列—Python组合模式:构建灵活的对象组合

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

7 种有助于压缩图像的最佳图像压缩工具

您的网站是否由于图像文件过大而表现不佳&#xff1f;现在是时候探索最适合您网站的图像压缩工具了。 影响页面加载速度的因素之一是需要更多资源来加载的庞大视觉对象&#xff0c;例如叠加图像。在这种情况下&#xff0c;您应该先压缩视觉对象&#xff0c;然后再将其上传到您…

什么护眼台灯性价比高又亮?五款性能好的护眼台灯推荐

现在不止是小孩子需要保护眼睛&#xff0c;而我们的成年人也是需要保护眼睛。因为现在上班压力大&#xff0c;下班回家加班也成了日常操作&#xff0c;每天用眼&#xff0c;对着电子产品的时间也会很久&#xff0c;眼睛会感到不舒服。回到家中&#xff0c;我们就需要一款好的护…

【2024华为杯研究生数学建模竞赛】比赛思路、代码、论文更新中.....

目录 赛中助攻华为杯常用建模算法&#x1f5d2;️&#x1f5d2;️历年优秀论文⭐⭐论文模板1&#xff09;论文模板2&#xff09;基础画图能力 绘图与数据分析软件SPSSPRO 2024研究生数学建模竞赛时间为9月21日&#xff08;周六&#xff09;8:00至9月25日&#xff08;周三&#…

HTML5精粹练习第1章博客

第1章博客 用最新的HTML5标签来联系博客 HTML文件&#xff1a;第1章博客.html <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"description" content"这是一个HTML5案例" /><meta name"…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会——华南师范大学佛山校区

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月26日&#xff08;星期四&#xff09;19:00 &#x1f3e0;地点&#xff1a;华南师范大学佛山校区图书馆电影院 &#x1f386;2024T…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题七

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…