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
#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
size_t strlen ( const char * str ); #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是如何进行计算的,计算的是首地址到'\0'直接的字符个数,arr1数组是通过单引号进行初始化的,初始化几个元素就是几个元素,其中没有包含\0,因此在计算字符串长度时,遇到'\0'才停止,但是此处不知道什么为'\0',所以该长度为随机值(编译器不同答案就可能不一样)。
这就考到我们之前需要字符串时讲的一个知识点,双引号包裹的字符串在末尾会自动加上'\0',因此在计算arr2的长度时,在字符c之后遇到'\0'就会停止,也就能计算正确字符串长度。
首先我们需要知道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])); 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语言第二十三弹---指针(七)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【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> 标签/元素只是图形容器,必须使用脚本来绘制图形。 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 数据结构篇-实现红黑树的核心方法
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 红黑树的说明 2.0 红黑树的特性 3.0 红黑树的成员变量及其构造方法 4.0 实现红黑树的核心方法 4.1 红黑树内部类的核心方法 (1)判断当前…...
【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)
文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…...
【C语言 - 力扣 - 反转链表】
反转链表题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 题解1-迭代 假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。 在遍历链表时,将当前节点的 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只做拓展,可跳过。 PartOne introduction 首先要对于python这门语言有一个宏观的认识,包括特点和应用场景。 特点分析: 优势 提供了完善的基础代码库,许多功能不必从零编写简单优雅 劣势 运…...
Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured
我们自定对象封装指定数据,封装类上面一个红色警告,虽然不影响我们的执行,但是有强迫症看着不舒服, 去除方式: 在pom文件加上坐标刷新 <dependency><groupId>org.springframework.boot</groupId><…...
【流程图——讲解】
流程图介绍 流程图介绍 流程图介绍 流程图是一种图表,它展示了工作流程或过程中的步骤顺序,它通常由不同的符号表示,每个符号都代表一个步骤或过程中的一个元素,流程图非常有用,因为它们可以提供清晰、视觉化的过程表…...
「计算机网络」物理层
物理层的基本概念 物理层的作用:尽可能屏蔽掉不同传输媒体和通信手段的差异物理层规程:用于物理层的协议主要任务:确定与传输媒体的接口有关的一些特性 机械特性电器特性功能特性过程特性 数据通信的基础知识 数据通信系统的模型 划分为…...
ARM与X86架构的区别与联系
文章目录 1.什么是CPU2.复杂指令集和精简指令集3.ARM架构与X86架构的比较3.1.制造工艺3.2 64位计算3.3 异构计算3.4 功耗 4.ARM和X86的发展现状Reference 1.什么是CPU 中央处理单元(CPU)主要由运算器、控制器、寄存器三部分组成,从字面意思看…...
蓝桥杯每日一题------背包问题(二)
前言 本次讲解背包问题的一些延申问题,新的知识点主要涉及到二进制优化,单调队列优化DP,树形DP等。 多重背包 原始做法 多重背包的题意处在01背包和完全背包之间,因为对于每一个物品它规定了可选的个数,那么可以考虑…...
牛客错题整理——C语言(实时更新)
1.以下程序的运行结果是() #include <stdio.h> int main() { int sum, pad,pAd; sum pad 5; pAd sum, pAd, pad; printf("%d\n",pAd); }答案为7 由于赋值运算符的优先级高于逗号表达式,因此pAd sum, pAd, pad;等价于(…...
CIFAR-10数据集详析:使用卷积神经网络训练图像分类模型
1.数据集介绍 CIFAR-10 数据集由 10 个类的 60000 张 32x32 彩色图像组成,每类 6000 张图像。有 50000 张训练图像和 10000 张测试图像。 数据集分为5个训练批次和1个测试批次,每个批次有10000张图像。测试批次正好包含从每个类中随机选择的 1000 张图像…...
《傲剑狂刀》中的人物性格——龙吟风
在《傲剑狂刀》这款经典武侠题材的格斗游戏中,龙吟风作为一位具有传奇色彩的角色,其性格特征复杂且引人入胜。以下是对龙吟风这一角色的性格特点进行深度剖析: 一、孤高独立的剑客气质 龙吟风的名字本身就流露出一种独特的江湖气息,"吟风"象征着他的飘逸与淡泊名…...
KVM和JVM的虚拟化技术有何区别?
随着虚拟化技术的不断发展,KVM和JVM已成为两种主流的虚拟化技术。尽管它们都提供了虚拟化的解决方案,但它们在实现方式、功能和性能方面存在一些重要的差异。本文将深入探讨KVM和JVM的虚拟化技术之间的区别。 KVM(Kernel-based Virtual Mac…...
LeetCode力扣 面试经典150题 详细题解 (1~5) 持续更新中
目录 1.合并两个有序数组 2.移动元素 3.删除有序数组中的重复项 4.删除排序数组中的重复项 II 5.多数元素 暂时更新到这里,博主会持续更新的 1.合并两个有序数组 题目(难度:简单): 给你两个按 非递减顺序 排列的…...
如何解决利用cron定时任务自动更新SSL证书后Nginx重启问题
利用cron定时任务自动更新SSL证书后,用浏览器访问网站,获取到的证书仍然是之前的。原因在于没有对Nginx进行重启。 据说certbot更新完成证书后会自动重启Nginx,但显然经我检测不是这回事儿。 所以我们需要创建一bash脚本,然后定时调用这个脚…...
第一个 Angular 项目 - 静态页面
第一个 Angular 项目 - 静态页面 之前的笔记: [Angular 基础] - Angular 渲染过程 & 组件的创建 [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 这是在学完了上面这三个内容后能够完成的项目,目前因为还没有学到数…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

