news 2026/8/4 5:46:00

C语言(函数与数组)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言(函数与数组)
8.函数和一维字符型数组
传参:
char数组名[100];
定义:
返回值 函数名(char数组名[])
{
函数体;
}
调用:函数名(数组名);
void print_str(char str[])
{
}
print_str(str);
注意:
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
9.函数和二维整形数组
传参:
定义:
返回值 函数名(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]));
注意:
1.二维整形数组传参时,形参必须说明是二维数组,行数可以省略,列数不能省略。
形参:int a[][列数]
2.在自定义的函数中,行数无法计算,所以可以通过参数的方式传递
3.在自定义的函数中,列数可以计算:
sizeof(a[0]) / sizeof(a[0][0]);
10.函数和二维字符型数组
传参:
定义:
返回值 函数名(char数组名[][列数], int行数)
{}
调用:函数名(数组名, 行数);
char str[3][100] = {0};
void print_2DC_array(char str[][100], int hang)
{
}
print_2DC_array(str, 3);
11.变量的作用域和生命周期
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段。
3.变量的存储类型
int a
存储类型 数据类型 变量名;
变量的存储类型:
auto:默认存储类型
static
1. static修饰局部变量,静态变量,具备静态生命周期(延长局部变量的生命周期)。
2. static修饰函数:该函数只允许在当前原文件中被调用。
3. static修饰全局变量:该变量只允许在当前文件中使用。
register
寄存器变量。
register修饰变量时,建议编译器将该变量存储在寄存器中。
register int i = 0;
register仅仅是一个建议。
int *p;
p = &i; //x i是寄存器变量,无法取址
extern
修饰全局变量/函数声明。
1. extern修饰全局变量,用来声明全局变量,表示允许被外部的.c使用。
2. extern声明函数,表示该函数允许被外部的.c使用。
12.预处理命令
1. gcc的编译的四个步骤:
2.预处理命令
宏定义
不带参宏:---》符号常量
#define标识符 值
#define PI 3.1415
带参宏(宏函数)
#define标识符(参数1, 参数2,参数3)宏的实现
#define PI (3.14)
#define ADD(a, b) ((a)+(b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define AREA(r) ((PI) * (r) * (r))
注意:
1.宏作为预处理命令,负责在预处理阶段展开,不做运算,只是代码的替换
2.宏标识符最好大写,定义宏时不能加分号
3.宏只是代码的替换,能加()就加括号。
4.宏和函数的区别
宏是预处理阶段的代码替换、会使得代码体积增大
函数是在运行时的调用,需要保护现场和恢复现场
头文件包含
#include <stdio.h>
#include "head.h"
头文件放:
1.可以有包含的其他头文件
2.声明的数据类型
3.宏定义
4.函数和全局变量的声明
注意:
1. <>表示包含的是系统中的头文件,让编译器从系统路径下找:/usr/include
2. ""表示包含的头文件是用户自己定义的头文件,让编译器从当前路径下寻找。
条件编译
1.头文件中防止头文件重复包含
#ifndef
#define
//头文件内容
#endif
根据有没有被定义出来决定该头文件中的内容要不要加入到编译中。
2.条件编译
#if逻辑结果表达式
//代码
#endif
根据逻辑结果表达式的结果,决定中间的代码要不要加入到编译中
//代码屏蔽
#if 0
//代码
#endif
3.条件编译
#ifdef
//代码1
#else
//代码2
#endif
根据有没有被定义决定是否编译代码1或者代码2
#ifndef
//代码1
#else
//代码2
#endif
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/4 5:44:29

NGINX限流技术原理与实战配置详解

1. NGINX限流技术全景解析在分布式系统架构中&#xff0c;流量控制是保障服务稳定性的核心防线。作为高性能Web服务器的代表&#xff0c;NGINX内置了完善的限流模块&#xff0c;能够在不引入额外中间件的情况下实现精细化的流量管控。我曾在电商大促期间通过合理配置NGINX限流规…

作者头像 李华
网站建设 2026/8/4 5:43:50

抖音下载器终极指南:三步轻松获取高清无水印视频与封面

抖音下载器终极指南&#xff1a;三步轻松获取高清无水印视频与封面 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…

作者头像 李华
网站建设 2026/8/4 5:43:10

桌面智能体如何重构SaaS价值:从自动化脚本到跨应用协作者的演进

1. 一个桌面Agent的“觉醒”时刻&#xff1a;从工具到“参与者”的视角转换那天下午&#xff0c;我正在调试一个自动处理Excel报表的桌面自动化脚本。它运行得很顺畅&#xff0c;按预设的规则抓取数据、填充模板、生成图表&#xff0c;最后通过邮件发送给指定人员。这本来是一个…

作者头像 李华
网站建设 2026/8/4 5:37:38

【需求分析】基于 GPT-5.6 + Codex 开发个人工具箱 Personal Toolbox 项目

其实是第二个 AI 项目。但前一个项目因没有经验&#xff0c;搞得太乱&#xff0c;现在被卡在一半不想继续。 新的项目从需求分析开始&#xff0c;每一次功能更新/完成都会复盘一下。 本次想法是给自己开发一个多功能工具箱&#xff0c;GitHub仓库。 1 前言 在日常使用 AI、浏览…

作者头像 李华
网站建设 2026/8/4 5:31:35

C# WinForm TCP Socket

一、基础定义Socket&#xff08;套接字&#xff09; 网络通信端点&#xff0c;负责程序之间的数据传输&#xff1b;IP地址&#xff08;定位设备&#xff09; 端口号&#xff08;定位程序&#xff09; SocketTCP 协议 面向连接、可靠传输&#xff1b;通信前建立连接&#xff0…

作者头像 李华
网站建设 2026/8/4 5:30:50

智能英文名生成系统:基于谐音匹配与知识图谱的命名算法实践

1. 项目概述&#xff1a;一个名字背后的文化与技术你有没有想过&#xff0c;你的英文名可能正在悄悄“出卖”你&#xff1f;我说的不是隐私&#xff0c;而是你的文化背景、个人偏好&#xff0c;甚至是你起名时那份微妙的心理。一个叫“Cherry”的女孩&#xff0c;可能希望自己甜…

作者头像 李华