news 2026/8/3 8:41:36

嵌入式从0到精通——C语言函数(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式从0到精通——C语言函数(二)

一、函数与一维字符型数组

定义:
返回值 函数名(int 数组名[], int len)
{
// sizeof(数组名); ----》sizeof(int *) ---->8字节
//外面数组怎么使用,函数内数组就怎么使用
}

调用:
函数名(数组名, 数组长度);
void print_array(int a[], int len)
{
}
print_array(a, len);

数组的数组名是数组的首元素地址。

传参:

注意:

  1. 一维字符型数组作为函数参数传递时,只需要传递数组即可,不需要传递长度,因为字符型数组保存的字符串,末尾有'\0'结束标志。
  2. 数组作为函数参数传递时,本质传递的是数组的首元素地址(在被调函数中:sizeof(数组名形参)--->本质求地址在计算机内存中的大小)。

练习:

  1. 封装 mystrlen 函数,返回数组中有效字符的个数
  2. 封装 mystrcpy 函数,将源字符型数组中的元素拷贝到目标字符型数组。
    void mystrcpy(char dst[], char src[]);
  3. 封装 mystrcat 函数,将源字符型数组中的元素拼接到目标字符型数组元素后边
    void mystrcat(char dst[], char src[]);
  4. 封装 mystrcmp 函数,实现两个字符串的比较,返回:>0 , 0, <0

二、函数和二维整型数组

传参:

注意:

  1. 二维整型数组传参时,形参必须说明是二维数组,行数可以省略,列数不能省略。

char 数组名[100];

定义:
返回值 函数名(char 数组名[])
{
函数体;
}

调用:函数名(数组名);
void print_str(char str[])
{
}
print_str(str);

定义:
返回值 函数名(int 数组名[][列数],int 行数)
{
}

调用:函数名(数组名,行数)
int a[3][4] = {0};
void print_2D_array(int a[][4], int hang)
{
}
printf_2D_array(a, sizeof(a)/sizeof(a[0]));

形参:int a[][列数]

  1. 在自定义的函数中,行数无法计算,所以可以通过参数的方式传递
  2. 在自定义的函数中,列数可以计算:
    sizeof(a[0]) / sizeof(a[0][0]);

三、函数和二维字符型数组

传参:

定义:
返回值 函数名(char 数组名[][列数], int 行数)
{
}

调用:函数名(数组名, 行数);
char str[3][100] = {0};
void print_2DC_array(char str[][100], int hang)
{
}
print_2DC_array(str, 3);

四、变量的作用域和生命周期

1. 标识符作用域(空间角度)

作用域:标识符/变量可以被使用的范围

  • 局部作用域:在{}内部被定义的变量的作用范围
  • 局部变量:定义在局部作用域中的变量(函数内部定义的变量、函数形参)
  • 全局作用域:可使用范围在全局,{}外面。比如:定义函数
  • 全局变量:定义在全局作用域的变量。

注意:

  1. 标识符必须先定义再使用。
  2. 在相同作用域中,不能定义同名标识符(变量、函数)。
  3. 在具有包含关系的作用域中,出现了同名标识符,外层标识符在内层不可见(就近原则)

2. 变量的生命周期(时间角度)

变量的生命周期:从变量的空间开辟到空间回收对应的生存期。

  • 动态生命周期:
    局部变量:在被定义的时候开辟空间,超出其作用域范围空间被回收。
  • 静态生命周期:和程序运行的生命周期一样长
    全局变量:从程序运行之前空间开辟,程序运行结束空间被回收。
    static 修饰的静态变量:从程序运行之前空间开辟,程序运行结束空间被回收。
    1. 作用域没发生变化,局部作用域。
    2. 生命周期变为静态生命周期。

总结:

局部变量:

  1. 作用域在局部,超出局部作用域无法访问;
  2. 动态生命周期,定义时开辟空间,超出作用范围空间被回收;
  3. 局部变量保存在栈区,未被初始化为随机值。

全局变量/static 静态变量:

  1. 全局变量作用域在全局,static 静态变量作用域在局部;
  2. 静态生命周期:程序运行之前空间开辟,程序运行结束空间被回收
  3. 全局变量/static 静态变量保存在数据区。
  4. 全局变量/static 静态变量未被初始化时,默认为 0。
  5. 未初始化的全局变量/static 静态变量存储在 .bss 段,.bss 段系统默认清 0。
  6. 已初始化的全局变量/static 静态变量存储在 .data 段。

五、变量的存储类型

变量的存储类型:

  • auto:默认存储类型
  • static:
    1. static 修饰局部变量,静态变量,具备静态生命周期(延长局部变量的生命周期)。
    2. static 修饰函数:该函数只允许在当前原文件中被调用。
    3. static 修饰全局变量:该变量只允许在当前文件中使用。
  • register:寄存器变量。
    int a;
    存储类型 数据类型 变量名;
    register 修饰变量时,建议编译器将该变量存储在寄存器中。

register int i = 0;
register 仅仅是一个建议。
int *p;

  • extern:修饰全局变量/函数声明。
    1. extern 修饰全局变量,用来声明全局变量,表示允许被外部的 .c 使用。
    2. extern 声明函数,表示该函数允许被外部的 .c 使用。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/3 8:40:18

脊柱侧弯微创矫正技术原理与广州临床应用

1. 脊柱侧弯微创矫正技术概述 脊柱侧弯是一种常见的脊柱三维畸形&#xff0c;表现为脊柱在冠状面上的侧向弯曲。传统开放手术虽然矫正效果确切&#xff0c;但存在创伤大、恢复周期长等问题。近年来&#xff0c;随着微创理念和技术的发展&#xff0c;脊柱侧弯微创矫正技术逐渐成…

作者头像 李华
网站建设 2026/8/3 8:38:36

Unity移动端性能优化实战:GPU Instancing与贴图压缩核心技术解析

1. 项目概述&#xff1a;为什么移动端优化是Unity开发者的必修课 做Unity移动端开发&#xff0c;尤其是面向中低端安卓设备或者追求60帧稳定体验的项目&#xff0c;性能优化从来都不是一个“可选项”&#xff0c;而是一个贯穿始终的“生存法则”。我经历过太多这样的场景&#…

作者头像 李华
网站建设 2026/8/3 8:36:27

Blender动画进阶:关键帧与曲线编辑器核心工作流详解

1. 项目概述&#xff1a;从“动起来”到“动得好看” 如果你刚开始接触Blender动画&#xff0c;可能会觉得让一个物体动起来很简单&#xff1a;选中它&#xff0c;按 I 键插入一个位置关键帧&#xff0c;移动时间轴&#xff0c;再移动物体&#xff0c;再按 I 键。恭喜你&am…

作者头像 李华
网站建设 2026/8/3 8:35:24

SSE技术解析:轻量级实时数据推送方案

1. Server-Sent Events技术全景解析当我们需要在Web应用中实现实时数据推送时&#xff0c;通常会想到WebSocket。但有一种更轻量、更简单的方案正在被越来越多的开发者采用——Server-Sent Events&#xff08;SSE&#xff09;。与WebSocket不同&#xff0c;SSE是建立在标准HTTP…

作者头像 李华
网站建设 2026/8/3 8:32:17

创源AIGC实测:用一套平台完成AI生图、二次编辑、短视频与漫剧样片

这不是一篇模型排行榜&#xff0c;也不是把多个产品名称简单罗列出来。本文围绕一个真实任务展开&#xff1a;如何在创源AIGC中完成角色设定、图片生成、结果二次编辑、短视频生成&#xff0c;并进一步整理成AI漫剧或短剧样片。适合阅读的人 正在做AI图片、短视频、AI漫剧、电商…

作者头像 李华
网站建设 2026/8/3 8:30:07

NAS流媒体平台全解析:Plex、Jellyfin、Kodi、VideoStation对比与实战

1. 项目概述&#xff1a;为什么要在NAS上折腾流媒体&#xff1f; 折腾家用NAS的朋友&#xff0c;最终大概率都会走到搭建个人流媒体中心这一步。原因很简单&#xff1a;当你的硬盘里塞满了辛苦收集来的电影、剧集、纪录片和家庭录像&#xff0c;你肯定不希望每次想看点什么&…

作者头像 李华