C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷五)

article/2025/8/15 23:07:45

目录

1. sizeof 和 strlen的区别

1.1 sizeof

1.2 strlen

2. 数组和指针习题解析

2.1  一维数组

2.2 字符数组

代码1:

代码2:

代码3:

代码4:

代码5:

代码6:

2.3 二维数组

3. 指针运算笔试题解析

3.1 

3.1 

3.3

3.4 

3.5

3.6

3.7

p1

p2

p3

p4


1. sizeof 和 strlen的区别

   

1.1 sizeof

sizeof 计算变量所占内存内存空间大小的,单位是字节,如果操作数是类型的话,计算的是使用类型创建的变量所占内存空间的大小

   

sizeof 只关注占⽤内存空间的大小,不在乎内存中存放什么数据

sizeof是操作符
sizeof计算操作数所占内存的⼤⼩,单位是字节
不关注内存中存放什么数据

#include <stdio.h>int main()
{int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;
}

1.2 strlen

strlen文档链接:

  

strlen - C++ Referencehttps://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen

strlen是库函数,使⽤需要包含头⽂件 string.h
srtlen是求字符串⻓度的,统计的是 \0 之前字符的隔个数
关注内存中是否有 \0 ,如果没有 \0 ,就会持续往后找,可能会越界

strlen 是C语言库函数,功能是求字符串长度。函数原型如下:

size_t strlen ( const char * str );

统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数,strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,所以可能存在越界查找

#include <stdio.h>int main()
{char arr1[3] = {'a', 'b', 'c'};char arr2[] = "abc";printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));printf("%d\n", sizeof(arr1));printf("%d\n", sizeof(arr2));return 0;
}

这里strlen(arr1)就是没有\0所以就越界查找,产生了随机值35

如果字符串中间就有一个\0,那么就以这个\0为基准


2. 数组和指针习题解析

2.1  一维数组

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

X86和X64环境下运行结果:

代码解析:

2.2 字符数组

 注意:

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

X86和X64环境下运行结果:

代码解析:

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

X86和X64环境下运行结果:

代码解析:

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

X86和X64环境下运行结果:

代码解析:

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

X86和X64环境下运行结果:

代码解析:

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

X86和X64环境下运行结果:

代码解析:

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

X86和X64环境下运行结果:

代码解析:

2.3 二维数组

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

X86和X64环境下运行结果:

代码解析:

数组名的意义:

   
1. sizeof(数组名),这⾥的数组名表⽰整个数组,计算的是整个数组的大小

   
2. &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址

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


3. 指针运算笔试题解析

   

3.1 

#include <stdio.h>int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}

3.1 

在X86环境下假设结构体的大小是20个字节程序输出的结构是什么

struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;//定义了一个指向 Test 结构体的指针 p,并将其初始化为内存地址 0x100000
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

运行结果: 

题目解析:

3.3

#include <stdio.h>int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int* p;p = a[0];printf("%d", p[0]);return 0;
}

 

a[0] 指向二维数组 a 第一行,这里将 a[0] 赋值给指针 p,此时 p 就指向了数组 a 的第一行的第一个元素,也就是值为 1 的那个元素

 

3.4 

//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}

3.5

#include <stdio.h>int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1);int* ptr2 = (int*)(*(aa + 1));printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

3.6

#include <stdio.h>int main()
{char* a[] = { "work","at","alibaba" };char** pa = a;pa++;printf("%s\n", *pa);return 0;
}

3.7

运算符优先级博客链接:

   

 C语言 —— 愿此世如黄金般辉煌 - 进制转换与操作符详解-CSDN博客https://blog.csdn.net/hedhjd/article/details/146116491?spm=1001.2014.3001.5501

#include <stdio.h>int main()
{char* c[] = { "ENTER","NEW","POINT","FIRST" };char** cp[] = { c + 3,c + 2,c + 1,c };char*** cpp = cp;printf("%s\n", **++cpp);printf("%s\n", *-- * ++cpp + 3);printf("%s\n", *cpp[-2] + 3);printf("%s\n", cpp[-1][-1] + 1);return 0;
}

 

 

p1

printf("%s\n", **++cpp);

++cpp 会使 cpp 指针自增,指向 cp +1的位置,也就是数组中的第二个元素,*cpp 得到c+2,c + 2 的指针指向字符串 POINT,然后再次*得到POINT

 

p2

printf("%s\n", *-- * ++cpp + 3);

 

p3

printf("%s\n", *cpp[-2] + 3);

p4

printf("%s\n", cpp[-1][-1] + 1);


完结撒花~


http://www.hkcw.cn/article/yKrPDfMgkC.shtml

相关文章

【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

文章目录 PyQt5入门级超详细教程前言第4部分&#xff1a;事件处理与信号槽机制4.1 什么是信号与槽&#xff1f;4.2 信号与槽的基本用法4.3 信号与槽的基础示例代码详解&#xff1a; 4.4 处理不同的信号代码详解&#xff1a; 4.5 自定义信号与槽代码详解&#xff1a; 4.6 信号槽…

MathType的安装与word嵌入

博主近期在写论文&#xff0c;发现word编辑公式好像只能用MathType&#xff0c;于是就去下载安装&#xff0c;然后遇到了蛮多问题总结一下&#xff0c;希望能帮到有相同问题的大家~ 一.MathType的下载 博主是在官网直接下载的&#xff0c;个人觉得没啥问题&#xff0c;下的也…

matlab:二维绘图篇——plot绘图命令

目录 1.plot绘图命令 &#xff08;1)plot(x) 实例——实验数据曲线 实例——窗口分割 实例——随机矩阵 (2).plot(x,y) 实例——摩擦系数变化曲线 &#xff08;3&#xff09;plot(x1,y1,x2,y2,...) 实例——正弦图形 实例——正弦余弦图形 &#xff08;4&#xff09…

Python的包管理工具pip安装

Python的包管理工具pip安装 一、安装步骤1.检查 pip是否已安装2.安装 pip方法一&#xff1a;通过 ​ensurepip​ 模块安装(推荐)方法二&#xff1a;通过 ​get-pip.py​ 脚本安装&#xff08;经常应为网络域名问题连接不上&#xff09; 3.验证pip安装4.创建别名5.更新pip 二、常…

【Python篇】PyQt5 超详细教程——由入门到精通(序篇)

文章目录 PyQt5 超详细入门级教程前言序篇&#xff1a;1-3部分&#xff1a;PyQt5基础与常用控件第1部分&#xff1a;初识 PyQt5 和安装1.1 什么是 PyQt5&#xff1f;1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…

C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 包装器 1.1、function包装器 1.2、bind 1 包装器 1.1、function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板&…

【Java 学习】详细讲解---包和导包、Scanner类、输入源

1. 包 1.1 什么是包&#xff1f; 举个例子&#xff0c;你和你的同学有不同的家庭&#xff0c;你们都有自己的爸爸妈妈&#xff0c;都有自己的家。在自己的家中你们可以按照自己爱好摆放东西&#xff0c;都互不干扰。但是&#xff0c;假如你们的家都在一起&#xff0c;你们就不…

LEfSe分析:R语言一句代码轻松实现

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 大家好&#xff0c;今天我将介绍如何使用R语言进行LEfSe&#xff08;Linear discriminant analysis Effect Size&#xff09;分析及可视化。LEfSe是一种基于线性判别分析的算法&#xff0c;…

马斯克遭白宫背刺 提名撤销引失望

刚走一天就遭白宫“背刺”,马斯克对此表示失望。2023年10月11日,美国国家航空航天局在休斯敦约翰逊航天中心首次向公众展示了从小行星贝努采集到的样本图片和视频。5月31日,美国白宫宣布撤销对富豪贾里德艾萨克曼出任下一任NASA局长的提名。据报道,艾萨克曼与企业家马斯克关…

双腿戴假肢男子4小时登顶泰山 毅力与自信的见证

5月31日上午,山东泰安泰山景区天气晴朗。一位双腿安装假肢的男士一手拄着拐杖一手抓住扶手向上攀登的场景被游客上传到社交媒体,引发网友热议。6月1日下午,当事人盛先生介绍,这是他第三次登泰山了,从中天门到南天门花费了约4个小时。盛先生说,今年端午假期前,他出差来到…

南京大学通报施工方偷窃学生物品 施工单位被罚违约金

5月29日,南京大学基本建设处发布了一份关于对南京诚善科技有限公司执行合同违约金的通报。通报指出,南京诚善科技有限公司员工于5月13日在学校宿舍楼内偷窃学生物品。根据施工合同相关规定并经处办公会研究确认,南京大学基本建设处决定对该公司执行2000元违约金,从工程款中…

为省30块钱 卡车司机在青海缺氧离世 爱心卡友千里送别

46岁的河南卡车司机常志荣在青藏线因高原缺氧离世。今天上午,多名爱心卡友跨越2400多公里,将他的骨灰及车辆从五道梁地区送回老家安阳林州。5月27日,常志荣在青藏线五道梁地区遭遇严重缺氧不幸去世。车友任先生透露,出发前同行曾建议他至少携带两罐氧气,但他为了节省30元费…

樊振东将改变德国联赛竞争格局 新援加盟引关注

北京时间6月1日,德甲萨尔布吕肯俱乐部宣布中国运动员樊振东加盟该俱乐部,将参与2025-2026赛季德国乒乓球甲级联赛和欧洲冠军联赛。这并不意味着国内赛场上看不到樊振东的身影。目前樊振东仍处在奥运后的调整期,计划通过全国比赛以及国内外俱乐部比赛逐步恢复运动状态。樊振东…

少写一点,发布快一点:2025年的前端极简主义

我们先直白点&#xff1a;你大概并不需要那些 Button.js、PrimaryButton.js、OutlinePrimaryButton.js 甚至 MaybeIfItsFridayButton.js。 在2025年&#xff0c;我们被过度抽象的组件库淹没了——原子设计、过度工程化的 UI 库。 现在&#xff0c;该是我们聊聊「反潮流」的前端…

聊一聊接口测试中耗时请求如何合理安排?

目录 一、异步处理与轮询机制 轮询检查机制 二、 并行化测试执行 三、模拟与桩技术&#xff08;Mock/Stub&#xff09; 四、动态超时与重试策略 五、测试架构设计优化 分层测试策略 并行化执行 网络优化 六、测试用例分层管理 金字塔策略 七、 缓存与数据复用 响应…

VMware没有虚拟网卡,VMnet1,VMnet8显示黄色三角警告

VMware安装后没有虚拟网卡&#xff0c;VMnet1&#xff0c;VMnet8显示黄色三角警告 VMware安装后没有虚拟网卡&#xff0c;VMnet1&#xff0c;VMnet8显示黄色三角警告 VMware安装后没有虚拟网卡&#xff0c;VMnet1&#xff0c;VMnet8显示黄色三角警告 问题描述&#xff1a; 主机…

情侣和一家三口在迪士尼打架 因拍照起冲突

5月31日,有网友发布视频称,在上海迪士尼有一对情侣和一家三口发生了冲突,此事引发了广泛关注。视频中可以看到,双方在现场扭打,周围的人纷纷上前劝阻。据权威人士透露,事件发生在5月31日,地点并不是排队区域,而是游客自由打卡拍照的地方。情侣和一家三口因拍照问题产生…

猎德村龙舟文化与其他地区区别是什么 翻船事件引关注

端午节对于很多人来说只是一个普通的假期,但对于广东人来说却意义非凡。因为在这一天,他们要举行紧张刺激的龙舟比赛。猎德村在以往的比赛中总是表现亮眼,但今年还没正式开始就闹出了大笑话。三条新龙舟中有两条翻了,隔壁村因此疯狂嘲笑他们。网友们得知龙舟翻船的原因竟与…

未来3天可能有地磁暴 或现红绿极光

6月1日,中国气象局国家空间天气监测预警中心发布消息,北京时间5月31日7时45分左右,太阳活动区14100开始爆发耀斑,软X射线流量迅速上升,并在8时05分达到M8.1级中等耀斑强度。预计未来三天可能发生地磁暴,6月2日左右我国北部地区有机会出现较为明显的极光,部分地区甚至可能…

莎拉称不优先考虑与马科斯和解谈判 民众与国家更重要

综合菲律宾《马尼拉标准报》等媒体报道,菲律宾副总统莎拉杜特尔特表示,她不优先考虑与总统马科斯进行和解谈判。莎拉认为,目前不应谈论和解,因为个人问题并不重要,更重要的是民众与国家的利益。此前,据路透社等媒体5月19日报道,马科斯在社交媒体上分享了一期播客,表达了…