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

嵌入式开发学习日志(指针与数组及传参) day12 持续更新中

一、指针与一维字符型数组的关系

1. 数组名的本质

  • 一维字符数组char str[] = {"hello"};中,str是数组名,它代表首元素地址,即&str[0],类型为char *
  • 数组名是一个地址常量,不可被赋值修改(如str = ...非法)。

2. 指针算术运算

  • str + 1指向第二个元素str[1],地址偏移量为sizeof(char)字节(通常为1字节)。
  • str + n指向第n+1个元素,等价于&str[n]
  • 解引用*(str + n)等价于str[n]

3. 内存布局示意

地址: 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 内容: 'h' 'e' 'l' 'l' 'o' '\0' 指针: str str+1 str+2 str+3 str+4 str+5

注意:字符串以\0结尾,是C语言字符串处理的终止标志。

4. 函数参数传递

  • 函数形参char str[]char *str等价,均接收数组首地址。
  • 示例:int mystrlen(char str[])int mystrlen(char *str)功能完全相同。

二、数组指针

1. 定义与本质

  • 数组指针:本质是指针,指向整个数组
  • 语法:int (*p)[5];—— 声明一个指针p,它指向一个包含5个int元素的数组。
  • 该指针变量本身占8字节(64位系统),但其指向的内存块大小为5 * sizeof(int)

2. 与普通指针的区别

  • int a[5] = {1,2,3,4,5};
    • a&a[0]:类型为int *,指向首元素。
    • &a:类型为int (*)[5],指向整个数组。
  • a + 1:偏移sizeof(int)字节 → 指向a[1]
  • &a + 1:偏移sizeof(a)字节 → 指向数组末尾之后的位置(即跳过整个数组)。

3. 内存布局示意

地址: 0x2000 0x2004 0x2008 0x200C 0x2010 0x2014 内容: 1 2 3 4 5 (越界) 指针: a a+1 a+2 a+3 a+4 &a+1 ↑ &a (指向整个数组)

4. 特别注意

  • sizeof(a)返回整个数组大小(如5 * 4 = 20字节)。
  • &a不能当作int *使用,其类型是int (*)[5],用于指向数组整体。

三、指针与二维数组

1. 二维数组的本质

  • 二维数组int a[2][3] = {1,2,3,4,5,6};在内存中是连续存储的,按行优先排列。
  • 数组名a代表首行地址,即&a[0],类型为int (*)[3](指向含3个int的一维数组)。
  • a[0]是第一行的数组名,类型为int *,指向a[0][0]
  • a[1]是第二行的数组名,类型为int *,指向a[1][0]

2. 指针运算与访问

  • a + 1→ 指向第二行,即&a[1],偏移量为3 * sizeof(int)
  • *(a + m) + n→ 等价于&a[m][n]
  • *(*(a + m) + n)→ 等价于a[m][n]

3. 内存布局示意

地址: 0x2000 0x2004 0x2008 0x200C 0x2010 0x2014 内容: 1 2 3 4 5 6 行指针: a[0] ← a[0][0]~a[0][2] a[1] ← a[1][0]~a[1][2] 整体指针: a → &a[0], a+1 → &a[1]

4. 作为函数参数传递

  • 二维数组作函数参数时,必须指定列数,行数可省略。

  • 正确写法:

    void print_2D_array(int a[][3], int hang); // 列数必须指定 void print_2D_array(int (*pa)[3], int hang); // 数组指针形式
  • 调用:print_2D_array(a, 2);

  • 字符型二维数组同理:

    char str[3][100] = {"hello", "world", "thanks"}; void print_str_array(char str[][100], int hang); void print_str_array(char (*pstr)[100], int hang);

总结对比表

概念类型含义示例
一维数组名T *首元素地址str&str[0]
数组指针T (*)[N]指向整个数组&aint (*)[5]
二维数组名T (*)[N]首行地址a&a[0]
二维数组行名T *某行首元素地址a[0]&a[0][0]
函数参数传递T arr[][N]T (*p)[N]必须指定列数void f(int a[][3])
http://www.jsqmd.com/news/1345348/

相关文章:

  • 2026王店高端自建房别墅外墙哪家口碑好|明威涂料高耐候自建房别墅外墙公司推荐 - mobible
  • AutoCAD LISP实现散线外轮廓自动查找:算法原理与工程实践
  • 开源工业协议栈实战指南:从EtherCAT到OPC UA的选型与开发
  • Linux隐藏文件管理与查看技巧详解
  • TotalBoundary CAD外轮廓提取插件试用版:智能生成复杂图形边界线
  • 2026襄都区门禁,停车场道闸厂家哪家好?选购避坑实用攻略 - mobible
  • AI工程化成本治理:全链路Token智控从原理到实战
  • 基于Coze工作流构建AI短视频自动化生成系统:从爆款公式到工程实践
  • TVA-VLA双引擎协同架构与典型案例
  • 2026武汉名酒回收行业市场测评报告:靠谱门店推荐与避坑指南 - 资讯综合
  • 【温州市】2026CPPM采购经理报考指南|正规机构甄选产业适配全攻略 - 中采供培
  • 宁津县自来水管漏水检测避坑干货,常见问题全覆盖,选专业靠谱公司,3 家热榜推荐更有保障 - 同城资讯
  • 2026秦皇岛空调外机百叶窗厂家推荐、市政护栏厂家哪家好避坑指南:4个常见坑与5条硬标准,靠谱 - mobible
  • STM32低功耗设计实战:主频调节与睡眠模式配置指南
  • 2026年双效近视防控镜片哪里有卖 来西安顾视眼镜看看 - 奔跑123
  • 算法日常・每日刷题--<队列,宽搜>1
  • AI编程助手工程化实践:Prompt与Hook协同保障代码质量
  • UE5动画入门:从FBX导入到混合空间1D驱动角色行走
  • 乔迁开业送礼首选!太原优质黄铜摆件门店测评(艺铜源铜饰) - 国麟测评
  • 天猫改价系统:不抢焦不抢屏,后台跑百店你前台打游戏
  • 2026汕头纸箱印刷厂家推荐、包装制版行业软件插件开发厂家哪家好?避坑指南与靠谱商家参考 - mobible
  • 2026年长春空气能热泵正规厂家**单一览 - 奔跑123
  • 无犯罪证明翻译件怎么办理?正规线上翻译流程实操 - 信息快递
  • AI编程助手分层设计:从工具到智能同事的Agent进化实战
  • 2026年管道设备配件实力工厂甄选:螺旋焊管与防腐保温管道的制造逻辑 - 优企名品
  • 2026年想去乌鲁木齐租车?哪家才是你的最佳选择,速来了解! - 米諾
  • C#实现工程级黑杰克游戏:从领域建模到状态机实战
  • 用检索增强生成让大模型更强大,这里有个手把手的Python实现
  • # 成都温江区公平街道防水补漏公司推荐|新旧小区渗水修缮,本地实体服务商参考 - 吉林同城获客
  • 如何用嘎嘎降AI处理护理学论文:护理学毕业论文降AI免费4.8元知网达标完整教程