当前位置: 首页 > news >正文

C语言第二十三弹---指针(七)

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

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

指针

1、sizeof和strlen的对比

1.1、sizeof

1.2、strlen

1.3、sizeof 和 strlen的对比

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

2.1、⼀维数组

2.2、二维数组

总结


1、sizeof和strlen的对比

1.1、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 是C语言库函数,功能是求字符串长度。函数原型如下:
size_t strlen ( const char * str );
注:strlen需要包含头文件#include<string.h>,可以在cplusplus旧版本搜索,前面函数章节有详细讲解查库函数的两个工具。
统计的是从 strlen 函数的参数 str 中这个地址开始向后, \0 之前字符串中字符的个数。
strlen 函数会⼀直向后找 \0 字符,直到找到为止,所以 可能存在越界查找。
#include<string.h>
#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)是15呢?按照我们正常思维是不是应该为3呢?
听小林娓娓道来,首先需要知道strlen是如何进行计算的,计算的是首地址到'\0'直接的字符个数,arr1数组是通过单引号进行初始化的,初始化几个元素就是几个元素,其中没有包含\0,因此在计算字符串长度时,遇到'\0'才停止,但是此处不知道什么为'\0',所以该长度为随机值(编译器不同答案就可能不一样)。
那有uu会说为什么strlen(arr2)就是3呢?
这就考到我们之前需要字符串时讲的一个知识点,双引号包裹的字符串在末尾会自动加上'\0',因此在计算arr2的长度时,在字符c之后遇到'\0'就会停止,也就能计算正确字符串长度。
为什么sizeof(arr2)是4呢?按照正常思维是不是应该为3呢?
首先我们需要知道sizeof是如何进行计算的,sizeof计算的是占用内存空间的大小,单位为字节,上述我们刚刚讲到双引号包裹的字符串在末尾会自动加上'\0',因此arr2中的元素有abc\0四个,根据数组不加大小的原则,实际为几个字节那么数组就占用几个字节,因此arr2占用的大小为4字节,即sizeof(arr2)为4。

1.3、sizeof 和 strlen的对比

sizeof
strlen
1. sizeof是操作符
2. sizeof计算操作数所占内存的大小, 单位是字节
3. 不关注内存中存放什么数据
1. strlen是库函数,使用需要包含头⽂件 string.h
2. srtlen是求字符串长度的,统计的是 \0 之前字符的个数
3. 关注内存中是否有 \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));

sizeof计算操作数所占内存的大小, 单位是字节

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

//数组名单独放在sizeif内部代表的是整个数组大小(数据类型大小*数据个数),因此为16字节
printf("%d\n",sizeof(a+0));

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

//数组名为首元素地址,*a则为数组第一个元素,类型为int,因此为4字节
printf("%d\n",sizeof(a+1));

//数组名不是单独放在sizeof内部,因此数组名为数组首元素地址,+1则向后移动一个int类型大小位置,但还是地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。
printf("%d\n",sizeof(a[1]));

//a[1]为数组第二个元素,类型为int,因此为4字节
printf("%d\n",sizeof(&a));

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

//&a为整个数组的地址,解引用则为整个数组,因此此处为整个数组大小,即16字节

//也可以理解为*和&可以相互抵消,就是数组名单独在sizeof内部
printf("%d\n",sizeof(&a+1));

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

//a[0]为第一个元素,&a[0]为第一个元素的地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。
printf("%d\n",sizeof(&a[0]+1));

//a[0]为第一个元素,&a[0]为第一个元素的地址,+1则向后走int类型大小步,但是实质还是地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。

2.2、二维数组

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]));
sizeof计算操作数所占内存的大小, 单位是字节
int a[3][4] = {0};
printf("%d\n",sizeof(a));
//数组名单独放在sizeof内部代表整个数组大小(数据元素类型大小*元素个数,即4*3*4),因此为48字节。
printf("%d\n",sizeof(a[0][0]));
//a[0][0]为第一行第一列的元素,类型为int,因此大小为4字节。
printf("%d\n",sizeof(a[0]));
//a[0]单独放在sizeof内部代表整行元素,大小为4*4字节
printf("%d\n",sizeof(a[0]+1));
//a[0]为首行第一个元素地址,+1为第二行第一个元素地址,但实质还是地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。
printf("%d\n",sizeof(*(a[0]+1)));
//a[0]为首行第一个元素地址,+1为第二行第一个元素地址,解引用则为第二行首元素,int类型,4字节。
printf("%d\n",sizeof(a+1));
//a为首元素地址,在二维数组中,首元素地址为首行地址,+1则为第二行地址,但实质还是地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。
printf("%d\n",sizeof(*(a+1)));
//a为首元素地址,在二维数组中,首元素地址为首行地址,+1则为第二行地址,解引用则为第二行元素大小,4*4字节。
printf("%d\n",sizeof(&a[0]+1));
//&a[0]为首行的地址,+1位第二行的地址,但实质还是地址,地址在x64(64位)环境为8字节,x86(32位)环境为4字节。
printf("%d\n",sizeof(*(&a[0]+1)));
//&a[0]为首行的地址,+1位第二行的地址,解引用则为第二行的大小,4*4字节。
printf("%d\n",sizeof(*a));
//a为首元素地址,在二维数组中,首元素地址为首行地址,解引用则为首行的大小,4*4字节。
printf("%d\n",sizeof(a[3]));
//a[3]为第四行的地址,单独放在sizeof内部代表整行元素,虽然越界了,但是sizeof只看类型,大小为4*4字节。

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

相关文章:

C语言第二十三弹---指针(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 指针 1、sizeof和strlen的对比 1.1、sizeof 1.2、strlen 1.3、sizeof 和 strlen的对比 2、数组和指针笔试题解析 2.1、⼀维数组 2.2、二维数组 总结 1、si…...

用HTML5 + JavaScript绘制花、树

用HTML5 JavaScript绘制花、树 <canvas>是一个可以使用脚本 (通常为JavaScript) 来绘制图形的 HTML 元素。 <canvas> 标签/元素只是图形容器&#xff0c;必须使用脚本来绘制图形。 HTML5 canvas 图形标签基础https://blog.csdn.net/cnds123/article/details/112…...

Science重磅_让大模型像婴儿一样学习语言

英文名称: Grounded language acquisition through the eyes and ears of a single child 中文名称: 通过一个孩子的眼睛和耳朵基于实践学习语言 文章: https://www.science.org/doi/10.1126/science.adi1374 代码: https://github.com/wkvong/multimodalbaby 作者: Wai Keen V…...

Java 数据结构篇-实现红黑树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 红黑树的说明 2.0 红黑树的特性 3.0 红黑树的成员变量及其构造方法 4.0 实现红黑树的核心方法 4.1 红黑树内部类的核心方法 &#xff08;1&#xff09;判断当前…...

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…...

【C语言 - 力扣 - 反转链表】

反转链表题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 题解1-迭代 假设链表为 1→2→3→∅&#xff0c;我们想要把它改成 ∅←1←2←3。 在遍历链表时&#xff0c;将当前节点的 next 指针改为指向前一个节点。由于节点没…...

ctfshow-php特性(web102-web115)

目录 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web114 web115 实践是检验真理的 要多多尝试 web102 <?php highlight_file(__FILE__); $v1$_POST[V1]; $v2$_GET[v2]; $v3$_GET[v3]; $v4is_numeric($v2)and is…...

python系统学习Day1

section1 python introduction 文中tips只做拓展&#xff0c;可跳过。 PartOne introduction 首先要对于python这门语言有一个宏观的认识&#xff0c;包括特点和应用场景。 特点分析&#xff1a; 优势 提供了完善的基础代码库&#xff0c;许多功能不必从零编写简单优雅 劣势 运…...

Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured

我们自定对象封装指定数据&#xff0c;封装类上面一个红色警告&#xff0c;虽然不影响我们的执行&#xff0c;但是有强迫症看着不舒服&#xff0c; 去除方式&#xff1a; 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…...

【流程图——讲解】

流程图介绍 流程图介绍 流程图介绍 流程图是一种图表&#xff0c;它展示了工作流程或过程中的步骤顺序&#xff0c;它通常由不同的符号表示&#xff0c;每个符号都代表一个步骤或过程中的一个元素&#xff0c;流程图非常有用&#xff0c;因为它们可以提供清晰、视觉化的过程表…...

「计算机网络」物理层

物理层的基本概念 物理层的作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异物理层规程&#xff1a;用于物理层的协议主要任务&#xff1a;确定与传输媒体的接口有关的一些特性 机械特性电器特性功能特性过程特性 数据通信的基础知识 数据通信系统的模型 划分为…...

ARM与X86架构的区别与联系

文章目录 1.什么是CPU2.复杂指令集和精简指令集3.ARM架构与X86架构的比较3.1.制造工艺3.2 64位计算3.3 异构计算3.4 功耗 4.ARM和X86的发展现状Reference 1.什么是CPU 中央处理单元&#xff08;CPU&#xff09;主要由运算器、控制器、寄存器三部分组成&#xff0c;从字面意思看…...

蓝桥杯每日一题------背包问题(二)

前言 本次讲解背包问题的一些延申问题&#xff0c;新的知识点主要涉及到二进制优化&#xff0c;单调队列优化DP&#xff0c;树形DP等。 多重背包 原始做法 多重背包的题意处在01背包和完全背包之间&#xff0c;因为对于每一个物品它规定了可选的个数&#xff0c;那么可以考虑…...

牛客错题整理——C语言(实时更新)

1.以下程序的运行结果是&#xff08;&#xff09; #include <stdio.h> int main() { int sum, pad,pAd; sum pad 5; pAd sum, pAd, pad; printf("%d\n",pAd); }答案为7 由于赋值运算符的优先级高于逗号表达式&#xff0c;因此pAd sum, pAd, pad;等价于(…...

CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型

1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成&#xff0c;每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次&#xff0c;每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…...

《傲剑狂刀》中的人物性格——龙吟风

在《傲剑狂刀》这款经典武侠题材的格斗游戏中,龙吟风作为一位具有传奇色彩的角色,其性格特征复杂且引人入胜。以下是对龙吟风这一角色的性格特点进行深度剖析: 一、孤高独立的剑客气质 龙吟风的名字本身就流露出一种独特的江湖气息,"吟风"象征着他的飘逸与淡泊名…...

KVM和JVM的虚拟化技术有何区别?

随着虚拟化技术的不断发展&#xff0c;KVM和JVM已成为两种主流的虚拟化技术。尽管它们都提供了虚拟化的解决方案&#xff0c;但它们在实现方式、功能和性能方面存在一些重要的差异。本文将深入探讨KVM和JVM的虚拟化技术之间的区别。 KVM&#xff08;Kernel-based Virtual Mac…...

LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中

目录 1.合并两个有序数组 2.移动元素 3.删除有序数组中的重复项 4.删除排序数组中的重复项 II 5.多数元素 暂时更新到这里&#xff0c;博主会持续更新的 1.合并两个有序数组 题目&#xff08;难度&#xff1a;简单&#xff09;&#xff1a; 给你两个按 非递减顺序 排列的…...

如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题

利用cron定时任务自动更新SSL证书后&#xff0c;用浏览器访问网站&#xff0c;获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本&#xff0c;然后定时调用这个脚…...

第一个 Angular 项目 - 静态页面

第一个 Angular 项目 - 静态页面 之前的笔记&#xff1a; [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目&#xff0c;目前因为还没有学到数…...

Shopee风控算法逆向 - Unidbg补环境实战解析

1. Shopee风控算法逆向分析入门 最近在研究Shopee的风控机制时&#xff0c;我发现他们的Native层加密算法特别有意思。作为一个常年和移动安全打交道的开发者&#xff0c;今天想和大家分享下使用Unidbg模拟执行Shopee风控算法的完整过程。 Shopee作为东南亚头部电商平台&…...

OpenClaw备份与迁移:GLM-4.7-Flash项目完整转移指南

OpenClaw备份与迁移&#xff1a;GLM-4.7-Flash项目完整转移指南 1. 为什么需要完整的迁移方案 上周我的主力开发机突然硬盘故障&#xff0c;导致所有数据丢失。虽然OpenClaw本身是开源工具可以重装&#xff0c;但那些精心调试的配置文件、自定义技能和对接好的GLM-4.7-Flash模…...

保姆级教程:在Ubuntu 22.04上搭建PXE服务器,自动化安装麒麟桌面系统(含NFS/TFTP/DHCP配置)

从零构建PXE自动化部署平台&#xff1a;Ubuntu 22.04环境下的麒麟系统无人值守安装实战 在中小型技术团队或开发者个人的工作场景中&#xff0c;频繁部署测试环境往往成为效率瓶颈。传统的光盘或U盘安装方式不仅耗时费力&#xff0c;更难以保证多台设备配置的一致性。本文将带您…...

Display Driver Uninstaller深度指南:解决显卡驱动残留问题的系统级清理方案

Display Driver Uninstaller深度指南&#xff1a;解决显卡驱动残留问题的系统级清理方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display…...

LVDS信号完整性救星:Xilinx OSERDESE2+IDELAY2配置避坑指南

LVDS信号完整性救星&#xff1a;Xilinx OSERDESE2IDELAY2配置避坑指南 当你在Gbps级LVDS接口设计中遇到信号抖动问题时&#xff0c;是否曾盯着眼图上的毛刺束手无策&#xff1f;作为Xilinx FPGA开发者&#xff0c;我们常陷入这样的困境&#xff1a;明明按照手册配置了OSERDESE2…...

3步实现专业级字幕去除:面向视频创作者的AI处理工具全指南

3步实现专业级字幕去除&#xff1a;面向视频创作者的AI处理工具全指南 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除&#xff0c;无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API&#xff0c;本地实现。AI-based too…...

从提示词到成图:雯雯的后宫-造相Z-Image-瑜伽女孩真实案例分享(含新月式示例)

从提示词到成图&#xff1a;雯雯的后宫-造相Z-Image-瑜伽女孩真实案例分享&#xff08;含新月式示例&#xff09; 想用AI生成一张完美的瑜伽女孩图片&#xff0c;却总是被“AI手”、“奇怪姿势”和“塑料感”劝退&#xff1f;别急&#xff0c;今天我们就来手把手拆解一个真实案…...

从零掌握HunterPie:解锁《怪物猎人:世界》狩猎效率的实战指南

从零掌握HunterPie&#xff1a;解锁《怪物猎人&#xff1a;世界》狩猎效率的实战指南 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirro…...

为什么说程序 = 算法 + 数据结构

什么是程序&#xff1f;理解了算法和数据结构是什么&#xff0c;我们就能更清晰地定义程序&#xff1a;程序是算法和数据结构在特定编程语言中的具体实现。它是一系列指令的集合&#xff0c;这些指令精确地描述了如何操作&#xff08;算法&#xff09;特定组织的数据&#xff0…...

Nunchaku-FLUX.1-dev副业变现路径:AI绘画接单全流程(接单→提示词→交付)

Nunchaku-FLUX.1-dev副业变现路径&#xff1a;AI绘画接单全流程&#xff08;接单→提示词→交付&#xff09; 1. 从兴趣到收入&#xff1a;为什么选择Nunchaku-FLUX.1-dev做副业 如果你对AI绘画感兴趣&#xff0c;并且拥有一张消费级的显卡&#xff0c;比如RTX 3090或4090&am…...