int find_largest(int a[],int n)
{
74
}
max = a[0];
for (i = 1;i < n;i++)
if (a[i] > max)
使用下标获取 a[0]
for (i = 1;i < n;i++)
if (a[i] > max)
max = a[i];
return max;
通过在数组每个元素存储零 函数 修改数组
指明数组形式参数不会改变,申明中包含单词const
int find_largest(const int a[],int n)
给函数传递数组所需的时间不依赖于数组大小
给函数传递数组没有对数组进行复制 传递大数组不会产生不利
数组形式数组声明为指针
声明形式参数是数组如同声明指针
声明形式参数是数组 就如同声明它是指针 但是此不适合变量
int a[10]
编译器为0个整数预留了内存空间
int *a
把指针像数组名一样进行标记
指针 作为数组名,数组名作为指针
*p = a;
for (i = 0;i < N;i++)
sum += p[i];
*p 间接取值 指向a
处理多维数组的元素
C始终按照行为主顺序存储二维数组,行尾主的顺序存储二维数组 行尾主的顺序存储二维数组 先是0行元素
0 r -
使指针p指向二维数组中的第一个元素0行0列
通过重复自增p 访问到数组每一个元素
把二维数组所有元素初始化为0
int a[NUM_ROWS][NUM_COLS];
int a[NUM_ROWS][NUM_COLUMNS];
int row,columns;
for (row = 0;row < NUM_ROWS;row++)
for (col = 0;col < NUM_COLS;col++)
a[row][col] = 0;
a看成整形
int *p;
for (p = &a[0][0];p <= &a[NUM_ROWS - 1][NUM_COLS - 1];p++)// - 1 是因为数组下标计数从0 开始
循环从p指向 的a[0][0] 对p的连续自增可以使指针 p 指向a[0][1] 、a[0][2]
p达到a[0][NUM_COLS - 1] 0行的最后元素 再次对p自增使它指向a[1][0]第一行的第一个元素;
数组中的第一个元素;
处理多维数组的行
在二维数组的一行内处理元素
二维数组的一行内处理元素最好初始化p指向数组a中i行p = &a[i][0] 第几行的第一个元素;
p = &a[i][0];
p = &a[i][0];i行的数组元素0
a[i] i行中第一个元素指针
p = &a[i][0];
p = &a[i] 指向数组i行;a[i]是指向数组a的i行指针
把a[i]
指针的 算术运算 指针的算术运算 是指向指针的数组和数组的
指向指针的数组 ++ 是 所指向的数组元素的 位置 推进 内存位置;
用于指针算术运算要依赖指针类型标量
C标准 对于并非指向数组指针 并非指向数组的指针 指针运算 未定义的;
并非指针数组的指针 指针的运算是未定义的 着不能保证会发生意味 并不意味着 能
PDP-11 指针算术运算会产生执行较快的程序
char
说明声明字符串变量
字不符串变量并不等同于
既然字符串字面量作为数组存储
数组存储
编译器 把它看作char *类型指针
数组 指针
字符串字面量本质作为数组来存储 编译器 char *类型指针
printf() scanf 接收char * 类型值作为他们的第一个参数
传递"abc" Address 整个数组的 字符串数组的第一个元素的内存地址;;
存储单元的指针;
传递 "abc"
允许使用char *指针的地方使用字符串字面量
char a[3] = "abc"
sizeof 计算内存变量占用字节数,依赖数据类型、机器CPU位数;
strlen 需要string.h 计算字符的 长度;
赋值操作不是复制字符 仅仅是使p指向字符串第一个字符 p指针指向字符串的第一个字符
char *p;
p = "abc";
赋值操作不是复制字符串,仅仅是p指向字符串首字符;
允许对指针添加下标,可以给字符串字面量添加下标;
指针添加下标,给字符串字面量添加下标
char ch;
ch = "abc"[1];
\\
字符串字面量字符常量
只包含一个字符的字符串字面量不同于字符常量 指针表示 指针指向存放字符内存单元
字符常量'a' 整数字符的 ASCII码表示
整数 一个指针指向字符串常量 所在内存单元
需要在
需要字符串 使用字符
printf 期望指针作为它 的参数
申明字符串变量提供了特殊的string
字符串常量
字符串变量
声明字符串变量,C提供不同方式,只有保证字符串是以空字符结尾 任何一维数组都可以用来存储字符串
有时候很难辨别是否把字符数组作为字符串来使用;
正确字符处理空
#define STR_LEN 80 宏名称 中间 #define Macro 替换数据
typedef int newType;
#define STR_LEN 80
char str[STR_LEN + 1]
STR_LEN 强调事实是str 可以存储最多80 字符
存放字符串字符数组时,始终保证数组长度比字符串长度多一个字符 C规定每个字符串都要以空字符结尾
C函数库中函数假设字符串都是以空字符结束;
申明长度为STR_LEN + 1字符数组并不是意味始终包含长度为STR_LEN字符串
字符串长度取决于空字符位置
字符串长度取决空字符位置
STR_L多种长度字符串EN + 1字符数组可以存放
char date1[8] = "June 14";
char date1[8] = {'J','u','n','e',' ','1','4','\0'}
初始化比字符串变量长 C 允许初始化 不包括空字符与变量完全等同长度;
计划初始化用来放置字符串字符数组
编译器忽略空字符 数组无法作为字符串使用;
字符串变量申明忽略长度,编译器自动计算
date4的字符数组的长度没有指明 并不意味着稍后可以改变长度
初始化很长 忽略字符串变量长度
申明为数组时,可以修改存储在数组中数据
指向字符串字面量 不可以修改字符串字面量 申明字符串 变量为指针时 字符指针变量指向字符串字面量 不可以修改字符串字面量
申明数组 date数组名称 申明指针 Date是变量 变量可以在程序执行期间指向其他
字符数组 字符指针
char *date = "June 14";
char date[] = "June 14"
可以修改字符串需要建立字符数组存储字符串 指针字符变量 指针变量
需要
已经存在的字符变量
指向已经存在的字符串常量
使用未初始化的指针变量作为字符串
为了一次性读入字符串 每次一个字符
printf puts 写字符串
允许函数写字符串 转换说明
char str[] = ""
字符数组
串
printf逐个写入字符串字符 直到遇到空字符停止
空字符丢失 越过字符串的末尾继续读写 最终直到内存的某个地方找到
partof 只显示字符串的部分
%.ps
%ms 大小为m域内 显示字符串
函数读字符串
str数组名 自动把当制作处理
scanf跳过空白字符,读入字符,并且把读入的字符存储到str
直到遇在字符串始终会到空白字符, 末尾存储空白 字符
用scanf函数读入字符串 不会包含空白字符串 用scanf读入字符串 不包含空白 换行符会使scanf停止读入 空格符 制表
使函数停止读入;
gets不会再开始读字符串之前跳过空白字符
gets会持续读入直到找到换行符才停止 直到遇到换行 scanf 会在任意空白字符处停止
gets函数持续读入直到遇到换行符
gets 忽略换行不会把它存储到数组 用空白字符存储数组 空白字符代替换行符
char sentence[SENT_LEN + 1];
printf("Enter a sentence: \n");
scanf("%s",sentence)'
字符读入数组 都无法检测何时填满数据
越过数组的边界存储字符
转换说明%ns 指明 最大可以存储
需要的函数不会跳过空白字符, 第一个换行符 忽略额外
最大读入字符数量
int read_line(char str[],int n);
read_line返回实际存储在str
如果
int read_line
terminates string;
number of characters stored
int read_line(char str[],int n)
{
char ch;
int i = 0;
while ((ch = getchar()) ! = '\n')
if (i < n)
str[i++]
= ch}
str['\0']
return i;
terminates string
int read_line
int read_line(char str[],int n)
{
char ch;
int i = 0;
while ((ch = getchar()) ! = '\n')
if (i < n)
str[i++] = ch;
str[i] = '\0';
return i;
}
read_line函数在字符串末尾 放置空输入字符串的字符串 标准函数自动在
字符 可以通过测试字符是否为空字符定位字符串末尾
字符串库
strcpy字符串复制
char *strcpy(char *s1,const char *s2);
字符串 在数组中的表示判断依据是 遇到空格
空字符strcpy函数返回S1 指向目的字符串指针
不改变s2指向 申明const 常量;
strcpy能使用 运算符复制字符串
数组名不能出现在赋值运算的左侧
char *strcpy(char *s1,char *s2);
函数把字符串s2复制给字符串s1 strcpy函数把s2指向的字符串复制到S1指向的数组
s2中字符串复制到哦S1 直到遇到s2中的一个空字符停止
strcpy返回S1 指向目的字符串指针
空字符
空格;
strcat strcpy
字符串拼接
char *strcat(char *s1,const char *s2);
strcat把字符串s2的内容追加到字符串s1的末尾,并且返回字符串s1 指向结构字符串的指针
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2015-08-31 cloudCompute
2015-08-31 banana pro 板子
2014-08-31 OpenStackCLI调试及术语识记
2014-08-31 OSCLI