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

C语言:数组名的理解(size of 和strlen示例)

C语言:数组名的理解

本文中会从size of 和strlen 两个函数中进行对比理解(看鹏哥C语言进行笔记整理)

intmy_strlen(charstr[])//参数部分写成数组的形式intmy_strlen(char*str)//参数部分写成指针的形式

文章目录

  • C语言:数组名的理解
  • 前言:size of 和strlen两个函数
  • **size of:**
  • **strlen:**
  • 总结:
  • 例一:int a[] = {1,2,3,4};
  • 例二:char arr[] = { 'a','b','c','d','e','f' };
  • 例三:char arr[] = "abcdef";
  • 例四:char* p = "abcdef";
  • 例五:int a[3][4] = { 0 };

前言:size of 和strlen两个函数

sizeof只关注占用内存空间的大小,不在乎内存中放的是什么 sizeof是操作符 strlen是求字符串长度的,关注的是字符串中的\0,计算的是\0之前出现的字符的个数 strlen是库函数,只针对字符串

size of:

  • 作用:求变量/类型/数组在内存中占的总字节大小

  • 本质:操作符

  • 会把结束符\0算进去

注:(字符串结束标志为\0)

strlen:

  • 作用:求字符串有效字符长度

  • 本质:库函数

  • 从开头数,遇到\0停止,不计算\0

例:当自编函数中用到下标left 和 right时,

int arr[] = {“abc”};
int right = strlen(arr)-1;
int right = size of (arr) / size of (arr[0]) - 2;(因为sizeof会计算\0,所以多减1)

总结:

数组名本质是数组首元素地址,但有两个例外:
1.size of(数组名):数组名表示整个数组–>计算整个数组的大小(单位:字节)
2.&数组名:取出的是整个数组的地址

例子:int arr[] = {0,1,2,3,4,5,6,7,8,9};

  • printf(“%p”,arr);----------首元素地址:0x12ff40 ---------->printf(“%p”,arr+1);-----------0x12ff44
  • printf(“%p”,&arr[0]);----首元素地址:0x12ff40----------->printf(“%p”,&arr[0]+1);------0x12ff44
  • printf(“%p”,&arr);--------数组的地址:0x12ff40----------->printf(“%p”,&arr+1);---------0x12ff68
  • 0x12ff68-0x12ff40=0x28==40/4=10个元素

&a[0] --> a
&a[0]+0 --> a+0
*&a --> a
*arr --> arr[0]
(arr+0) --> arr[0]
p[0]==
(p+0)==*p


例一:int a[] = {1,2,3,4};

代码如下:size of

intmain(){inta[]={1,2,3,4};1.printf("%d\n",sizeof(a));//4*4 = 16sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节2.printf("%d\n",sizeof(a+0));//4/8a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,a+0还是首元素的地址3.printf("%d\n",sizeof(a+1));//4/8这里的a是数组首元素的地址 a+1是第二个元素的地址sizeof(a+1)就是地址的大小4.printf("%d\n",sizeof(*a));//4*a中的a是数组首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素 首元素的大小就是4个字节5.printf("%d\n",sizeof(a[1]));//4计算的是第二个元素所占空间的大小6.printf("%d\n",sizeof(&a));//4/8&a取出的是数组的地址7.printf("%d\n",sizeof(*&a));//161.&a---->int(*)[4]&a拿到的是数组名的地址,类型是int(*)[4],是一种数组指针 数组指针解引用找到的是数组*&a--->a2.&*抵消了*&a--->a8.printf("%d\n",sizeof(&a+1));//4/8&a取出的是数组的地址&a-->int(*)[4]&a+1是从数组a的地址向后跳过了一个(4个整型元素的)数组的大小&a+1还是地址,是地址就是4/8字节9.printf("%d\n",sizeof(&a[0]));//4/8&a[0]就是第一个元素的地址10.printf("%d\n",sizeof(&a[0]+1));//4/8&a[0]+1是第二个元素的地址 大小是4/8个字节&a[0]+1--->&a[1]return0;}

例二:char arr[] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’ };

代码如下:size of

intmain(){chararr[]={'a','b','c','d','e','f'};1.printf("%d\n",sizeof(arr));//6*1=6sizeof(数组名)2.printf("%d\n",sizeof(arr+0));//4/8arr+0是数组首元素的地址3.printf("%d\n",sizeof(*arr));//1*arr就是数组的首元素,大小是1字节*arr-->arr[0]*(arr+0)-->arr[0]4.printf("%d\n",sizeof(arr[1]));//1第二个元素所占内存空间大小5.printf("%d\n",sizeof(&arr));//4/8&arr是数组的地址,是地址就是4/8个字节6.printf("%d\n",sizeof(&arr+1));//4/8&arr+1是数组后的地址7.printf("%d\n",sizeof(&arr[0]+1));//4/8&arr[0]+1是第二个元素的地址return0;}

代码如下:strlen

intmain(){chararr[]={'a','b','c','d','e','f'};1.printf("%d\n",strlen(arr));随机值:因为strlen计算的是\0之前所有元素个数2.printf("%d\n",strlen(arr+0));随机值3.printf("%d\n",strlen(*arr));*arr-->arr[0]strlen('a');-->strlen(97);野指针5.printf("%d\n",strlen(arr[1]));strlen('b')-->strlen(98);野指针6.printf("%d\n",strlen(&arr));随机值7.printf("%d\n",strlen(&arr+1));随机值-68.printf("%d\n",strlen(&arr[0]+1));随机值-1return0;}

例三:char arr[] = “abcdef”;

代码如下:sizeof和strlen

intmain(){chararr[]="abcdef";[a b c d e f \0]printf("%d\n",strlen(arr));//6printf("%d\n",strlen(arr+0));//6printf("%d\n",strlen(*arr));//errprintf("%d\n",strlen(arr[1]));//errprintf("%d\n",strlen(&arr));//6arr类型:char*arr+1跳过一个字节&arr类型:char(*)[7]&arr+1跳过一个数组strlen(constchar*)比喻:arr:客厅门牌号;&arr:房子门牌号 数字一样,范围不同 strlen只看门牌号printf("%d\n",strlen(&arr+1));//随机值printf("%d\n",strlen(&arr[0]+1));//5[a b c d e f \0]printf("%d\n",sizeof(arr));//7printf("%d\n",sizeof(arr+0));//4/8printf("%d\n",sizeof(*arr));//1printf("%d\n",sizeof(arr[1]));//1printf("%d\n",sizeof(&arr));//4/8printf("%d\n",sizeof(&arr+1));//4/8printf("%d\n",sizeof(&arr[0]+1));//4/8return0;}

例四:char* p = “abcdef”;

代码如下:sizeof和strlen

intmain(){char*p="abcdef";首元素地址放到p中1.printf("%d\n",sizeof(p));//4/8首元素地址0x12ff402.printf("%d\n",sizeof(p+1));//4/8第二个元素的地址0x12ff413.printf("%d\n",sizeof(*p));//1解引用第一个元素char类型4.printf("%d\n",sizeof(p[0]));//1p[0]==*(p+0)==*p5.printf("%d\n",sizeof(&p));//4/8p的指针,即二级指针6.printf("%d\n",sizeof(&p+1));//4/8p指针后的(跳过p指针)7.printf("%d\n",sizeof(&p[0]+1));//4/8&p[0]==p 第二个元素地址1.printf("%d\n",strlen(p));//6首元素地址2.printf("%d\n",strlen(p+1));//5第二个元素的地址3.printf("%d\n",strlen(*p));//err4.printf("%d\n",strlen(p[0]));//err5.printf("%d\n",strlen(&p));//随机二级指针到\0的字符个数 上下两个随机值没有联系6.printf("%d\n",strlen(&p+1));//随机跳过二级指针到\0的字符个数7.printf("%d\n",strlen(&p[0]+1));//5&p[0]==preturn0;}

例五:int a[3][4] = { 0 };

代码如下:size of

intmain(){inta[3][4]={0};1.printf("%d\n",sizeof(a));//3*4*4=482.printf("%d\n",sizeof(a[0][0]));//4第一行第一列的元素3.printf("%d\n",sizeof(a[0]));//16a[0]是第一行这个一维数组的数组名,单独放在sizeof内部,a[0]表示第一个整个这个一维数组sizeof(a[0])计算的就是第一行的大小4.printf("%d\n",sizeof(&a[0]));//4/8&a[0]-对第一行的数组名取地址,拿出的是第一行的地址5.printf("%d\n",sizeof(a[0]+1));//4/8a[0]并没有单独放在sizeof内部,也没取地址,a[0]就表示首元素的地址 就是第一行这个一维数组的第一个元素的地址,a[0]+1就是第一行第二个元素的地址printf("%d\n",sizeof(&a+1));//4/8跳过整个二维数组6.printf("%d\n",sizeof(*(a[0]+1)));//4a[0]+1就是第一行第二个元素的地址*(a[0]+1))就是第一行第二个元素7.printf("%d\n",sizeof(a+1));//4/8a虽然是二维数组的地址,但是并没有单独放在sizeof内部,也没取地址 a表示首元素的地址,二维数组的首元素是它的第一行,a就是第一行的地址 a+1就是跳过第一行,表示第二行的地址8.printf("%d\n",sizeof(*(a+1)));//4*4=16*(a+1)是对第二行地址的解引用,拿到的是第二行*(a+1)-->a[1]sizeof(*(a+1))-->sizeof(a[1])9.printf("%d\n",sizeof(&a[0]+1));//4/8&a[0]-对第一行的数组名取地址,拿出的是第一行的地址&a[0]+1-得到的是第二行的地址10.printf("%d\n",sizeof(*(&a[0]+1)));//16第二行的元素11.printf("%d\n",sizeof(*a));//16a表示首元素的地址,就是第一行的地址*a就是对第一行地址的解引用,拿到的就是第一行12.printf("%d\n",sizeof(a[3]));//16a[3]==a[0]//int a = 10;//sizeof(int);//sizeof(a);return0;}
http://www.jsqmd.com/news/669072/

相关文章:

  • vector模拟实现
  • 保姆级教程:用华为ENSP模拟器搞定企业级有线无线网络(含S5700/AC6605配置)
  • Python学习-数据结构与算法02
  • API的基础讲解
  • CTF SHOW WEB 4(无法查看源代码)
  • 【仅限首批200名AI架构师】:获取AGI融合系统故障诊断矩阵(含17类典型冲突模式+动态权重调优公式)
  • 抓包方案分享
  • 手把手教你:在UVM验证环境中安全使用disable fork管理并发线程
  • 当代码几乎免费时,程序员还剩下什么?
  • 基于springboot的加油站销售积分管理系统的设计与实
  • AI Agent的感知世界:多模态输入处理
  • AGI与机器人结合不是“加法”,而是“范式熔断”——SITS2026提出全新评估矩阵(含6维动态权重算法)
  • 手把手教你用CAPL脚本监控CANoe环境变量变化,实现自动化测试联动
  • C语言分支循环语句:第二篇:循环语句
  • 世界模型是人机环境系统智能的子集吗?
  • HC32F460驱动ILI9341并口屏:从SPI到16位并口的提速实战与emWin移植避坑
  • AGI游戏智能落地失败率高达67%?SITS2026专家团复盘11个真实项目,提炼出2个关键决策阈值与1个不可逆拐点
  • Netty 编解码器学习记:从粘包拆包到自定义协议
  • JAVA语法合集之(六):活用数组
  • 2026年评价高的天津预应力混凝土屋面板品牌厂家推荐 - 品牌宣传支持者
  • 数据结构面试题避坑指南:别再被这些‘送分题’骗了(附详细解析)
  • 半马:机器人已超过人类
  • 终极指南:专业级AMD Ryzen调试工具SMUDebugTool深度解析与实战应用
  • 2026届必备的五大AI辅助论文助手解析与推荐
  • 项目实训(一)|中医智能诊疗系统后端基础架构搭建与环境配置
  • 2026年3月评价好的除铁器公司口碑推荐,电磁悬挂除铁器/全自动永磁悬挂除铁器/永磁筒磁选机/电磁铁,除铁器厂家有哪些 - 品牌推荐师
  • 协作的“语法”:多 Agent 系统的编排
  • 别只背课文了!用Python爬虫+AI工具,高效复习《新概念英语三》Lesson 16-20
  • 智能客服的终局:从关键词匹配到能够处理复杂售后的全能 Agent
  • python开发一款翻译工具