一、数组
1.一维数组
数组是一组相同类型元素的集合
数组中存放的是1个或者多个数据,但是数组元素个数不能为0。
数组中存放的多个数据,类型是相同的。
数组创建
⼀维数组创建的基本语法如下:
type arr_name[常量值];
- 存放在数组的值被称为数组的元素,数组在创建的时候可以指定数组的大小和数组的元素类型。 type
- 指定的是数组中存放数据的类型,可以是: char、short、int、float 等,也可以自定义的类型 arr_name
- 指的是数组名的名字,这个名字根据实际情况,起的有意义就行。 []
- 中的常量值是用来指定数组的大小的,这个数组的大小是根据实际的需求指定就行。
数组初始化
int arr[5] = {1,2,3,4,5};//完全初始化
int arr2[6] = {1};//不完全初始化
//第⼀个元素初始化为1,剩余的元素默认初始化为0
int arr3[3] = {1, 2, 3, 4};
//错误的初始化 - 初始化项太多
数组下标
C语言规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下
标就相当于数组元素的编号,如下:
在C语言中数组的访问提供了⼀个操作符 [] ,这个操作符叫:下标引用操作符。
注:
这个[ ]与数组创建的[ ]不一样,不要弄混了。
数组的存储
每两个相邻的元素之间相差4
数组在内存中是连续存放的。
sizeof计算数组元素个数
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]);
printf("%d\n", sz);
return 0;
}
2.二维数组
把一维数组做为数组的元素,这时候就是二维数组,二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组。

初始化时可以省略行,但是不能省略列
int arr[][5] = {1, 2, 3}
二维数组的下标
C语言规定,二维数组的行是从0开始的,列也是从0开始的

二维数组的输入和输出
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍历⾏
//输⼊
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
}
}
//输出
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
二维数组的内存存储
二维数组中的每个元素都是连续存放的。

C99中的变长数组
C99中给一个变长数组的新特性,允许我们可以使用变量指定数组大小。
变长数组不能初始化。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
二、函数
C语言中的函数就是⼀个完成某项特定的任务的⼀小段代码。
在C语言中我们⼀般会见到两类函数:
库函数
自定义函数
C/C++官方的链接https://zh.cppreference.com/w/c/header
cplusplus.com:https://legacy.cplusplus.com/reference/clibrary/
库函数文档的一般格式
- 函数原型
- 函数功能介绍
- 参数和返回类型说明
- 代码举例
- 代码输出
- 相关知识链接
函数的语法形式
ret_type fun_name(形式参数)
{
}
ret_type 是函数返回类型,是⽤来表示函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回
fun_name 是函数名,是为了方便使用函数;就像⼈的名字⼀样,有了名字方便称呼,函数有了名字方便调
用,所以函数名尽量要根据函数的功能起的有意义。
括号中放的是形式参数,函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是 void ,明确表示函数没有参数。如果有参数,要交代清楚参数的类型和名字,以及参数个数。
{}括起来的是函数体,函数体就是完成计算的过程。
#include <stdio.h>
int Add(int x, int y)
{
int z = 0;
z = x+y;
return z;
}
int main()
{
int a = 0;
int b = 0;
//输⼊
scanf("%d %d", &a, &b);
//调⽤加法函数,完成a和b的相加
//求和的结果放在r中
int r = Add(a, b);
//输出
printf("%d\n", r);
return 0;
}
Add函数也可以简化为:
int Add(int x, int y)
{
return x+y;
}
形参和实参的关系
形参是实参的⼀份临时拷贝。
return语句注意事项
return后边可以是⼀个数值,也可以是⼀个表达式,如果是表达式则先执行表达式,再返回表达式
的结果。
return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。
return返回的值和函数返回类型不⼀致,系统会⾃动将返回的值隐式转换为函数的返回类型。
return语句执行后,函数就彻底返回,后边的代码不再执行。
如果函数中存在if等分⽀的语句,则要保证每种情况下都有return返回,否则会出现编译错误。
数组传参的几个重点知识
函数的形式参数要和函数的实参个数匹配
函数的实参是数组,形参也是可以写成数组形式的
形参如果是⼀维数组,数组大小可以省略不写
形参如果是⼆维数组,行可以省略,但是列不能省略
数组传参,形参是不会创建新的数组的
形参操作的数组和实参的数组是同⼀个数组
根据上述的信息,我们就可以实现这两个函数:
void set_arr(int arr[], int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
arr[i] = -1;
}
}
void print_arr(int arr[], int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
嵌套调用和链式访问
嵌套调用
例如:计算某年某月有多少天
//如果是闰年,返回1
//如果不是闰年,返回0
//判断y是否闰年
int is_leap_year(int y)
{
if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
return 1;
else
return 0;
}
//获取某年某月有多少天
int get_days_of_month(int y, int m)//1990 3
{
int days[13] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
// 0 1 2 3 4 5 6 7 8 9 10 11 12
int d = days[m];
if (is_leap_year(y) && m == 2)
{
d += 1;
}
return d;
}
int main()
{
int y = 0;//年
int m = 0;//月
scanf("%d %d", &y, &m);//1990 3
int d = get_days_of_month(y, m);
printf("%d\n", d);
return 0;
}
链式访问
将一个函数的返回值作为另外一个函数的参数,像链条一样将函数串起来就是函数的链式访问。
#include <stdio.h>
int main()
{
int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度
printf("%d\n", len);//2.打印⻓度
return 0;
}
system用来执行系统命令
需要引用头文件<windows.h>
Sleep 休眠,单位是毫秒
需要引用头文件<string.h>
函数的声明和定义
函数调用之前需要先声明,函数声明中参数只保留类型,省略掉名字也是可以的。
函数的调用⼀定要满意,先声明后使用。
static和extern
作用域
局部变量的作用域是变量所在的局部范围。
全局变量的作用域是整个工程。
生命周期
局部变量的生命周期是:进⼊作用域生命周期开始,出作用域生命周期结束。
全局变量的生命周期是:整个程序的生命周期。
static
static是 静态的 的意思,可以用来:
修饰局部变量
static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,生命周期就和程序的生命周期⼀样了,只有程序结束,变量才销毁,内存才回收。但是作用域不变的。
**使用建议:**未来⼀个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static
修饰。
修饰全局变量
extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使extern进行声明,然后使用。
⼀个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。本
质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以使用;但是全局变量被static修饰之后,外部链接属性就变成了内部链接属性,只能在自己所在的源文件内部使用 了,其他源文件,即使声明了,也是无法正常使用的。
**使用建议:**如果⼀个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。
修饰函数
static 修饰函数和static修饰全局变量是⼀模⼀样的,⼀个函数在整个工程都可以使用,被static修
饰后,只能在本文件内部使用,其他文件无法正常的链接使用了。
**使用建议:**⼀个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static修饰。
extern
extern 是用来声明外部符号的,如果⼀个全局的符号在A文件中定义的,在B文件中想使用,就可以使用extern进行声明,然后使用。
本文详细介绍了C语言中数组的一维和二维数组的概念、创建、初始化、下标及内存存储,包括C99中的变长数组特性。此外,还深入探讨了函数的语法、形参与实参的关系、return语句的使用、数组传参的重点知识,以及嵌套调用、链式访问和static、extern关键字的应用。
1121





