引用
数组
存储的是数据类型相同的数据
有位置
,
位置称为下标
(
索引
)
长度不可变
名词
长度:存储的元素的个数
元素:数组中存储的内容
下标:元素在数组中的位置,从0开始~长度-1结束
特点
1,长度不可变
2,存储的元素类型一致
作用
临时存储一组数据类型相同的数据的容器
分类
按存储的元素分类
整型数组
浮点型数组
字符数组
指针数组
结构体数组
...
按维度分类
一维数组
:
存储普通数据
二维数组
:
存储一维数组
三维数组
:
存储二维数组
...
一维数组
步骤
1,声明
语法:
extern 数据类型 数组名[长度];
注意
:
1,
可有可无
2,
长度此时可以忽略不写
2,定义与初始化
1,系统自动初始化
数据类型 数组名[长度];
注意
:
全局变量数组中的值为
0
局部变量数组中的值为随机数
不建议使用
2,部分初始化
数据类型 数组名[长度] = {值1,值2,值3,....};
注意
:
此时值的个数小于长度
将值从下标
0
的位置开始依次存储到数组中
,
剩余位置用
0
填充
特殊情况
:
将数组中所有数据制
0
3,全部初始化
数据类型 数组名[长度] = {值1,值2,值3,....};
注意
:
此时值的个数等于长度
,
将值从下标
0
的位置开始依次存储到数组中
此时长度可以忽略不写
4,间隔初始化
数据类型 数组名[长度] = {[下标] = 值,[下标] = 值,...};
注意
:
将指定位置的元素修改为指定的值
不建议使用
注意
:
不能将一个数组赋值给另一个数组
3,使用
取值
数组名
[
下标
]
存值
数组名
[
下标
] =
值
;
长度
int
长度
= sizeof(
数组名
) / sizeof(
数组名
[0]);
int
长度
= sizeof(
数组名
) / sizeof(
数据类型
);
遍历
将数组中的数据逐个取出
for(int i = 0; i <
长度
; i++)
{
数组名
[i]
}
练习
1,
定义一个数组存储班级学员年龄
,
班级人数
50,
年龄不知
int ages[50] = {0};
2,
定义一个数组以下数据
'h','e','l','l','o','w','o','r','l','d'
测量该数组长度
遍历该数组
char str[] = {'h','e','l','l','o','w','o','r','l','d'};
int len = sizeof(str) / sizeof(str[0]);
for(int i = 0; i < len; i++)
{
printf("%c\n",str[i]);
}
二维数组
1,声明
语法:
数据类型 数组名[长度1][长度2];
长度
1:
二维数组中存储一维数组的个数
长度
2:
一维数组中村的元素的个数
注意
:
长度
1
可以省略不写
,
长度
2
不能省略
2,定义与初始化
语法:
全部初始化
数据类型 数组名[长度1][长度2] = {
{值1,值2,值3,...},
{值1,值2,值3,...},
{值1,值2,值3,...},
...
};
数据类型 数组名[长度1][长度2] = {值1,值2,值3,...,值1,值2,值
3,...,值1,值2,值3,...,...};
注意
:
此时二维数组中一位数组的个数等于长度
1
一位数组中值的个数等于长度
2
在全部初始化时
,
长度
1
可以忽略不写
部分初始化
数据类型 数组名[长度1][长度2] = {
{值1,值2,值3,...},
{值1,值2,值3,...},
{值1,值2,值3,...},
...
};
数据类型 数组名[长度1][长度2] = {值1,值2,值3,...,值1,值2,值
3,...,值1,值2,值3,...,...};
注意
:
此时二维数组中一维数组的个数小于长度
1
或一维数组中值的个数小于长度
2
3,使用
取值
数组名
[
下标
1][
下标
2]
获取数组中的某个元素
下标
1:
要获取的元素所在的一维数组在二维数组中的位置
下标
2:
要获取的元素在所在一维数组中的位置
数组名
[
下标
1]
获取数组中的某个数组
注意
:
不能赋值给其他一维数组
存值
数组名
[
下标
1][
下标
2] =
值
;
长度
:
其中一维数组的个数
int
长度
= sizeof(
数组名
) / sizeof(
数组名
[0]);
遍历
for(int i = 0; i <
长度
1; i++)
{
for(int j = 0; j <
长度
2; j++)
{
数组名
[i][j]
}
}
练习
杨辉三角
i
0 1 0 0 0 0 0
1 1 1 0 0 0 0
2 1 2 1 0 0 0
3 1 3 3 1 0 0
4 1 4 6 4 1 0
5 1 5 10 10 5 1
0 1 2 3 4 5 j
...
程序完成
9*9
的杨辉三角
int nums[9][9] = {0};
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(j == 0 || i == j)
{
nums[i][j] = 1;
}
else if(j < i)
{
nums[i][j] = nums[i-1][j] + nums[i-1][j-1];
}
}
}
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("%d\t",nums[i][j]);
}
printf("\n");
}
一维字符数组
char str[
长度
] = {'h','e','l','l','o','w','o','r','l','d'};
char str[
长度
] = "helloworld";
注意
:
""
的字符数组默认系统自带
\0
printf
打印字符串时遇
\0
结束
可以直接使用
printf
打印一维字符数组
不能使用
printf
打印其他一维数组
注意:
scanf
输入字符数组遇空格或回车结束
gets
会导致数组下标越界
fgets
建议使用
fgets(
数组名
,sizeof(
数组名
),stdin);
二维字符数组
char strs[][50] = {"
张三
","
李四
","
王五
"};
for(int i = 0; i < sizeof(strs) / sizeof(strs[0]); i++)
{
printf("%s\n",strs[i]);
}
数组与函数
数组作为参数
数组作为参数进行传递时
,
传递的是数组中第一个元素在内存中的地址
64
位机地址长度位
8
字节
32
位机地址长度位
4
字节
基本数据类型的变量传递的是值
,
数组传递的地址
数组作为返回值
其实就是返回会一个地址
但是因为返回值类型不能写数组
,
所以返回指针
注意
:
局部变量随着所在函数的调用生成
,
随着所在函数的执行完毕而销毁
所以将局部变量的地址传递出来后
,
该局部变量被系统回收后
,
该地址的值为空
,
此
时使用该地址操作就好出现段错误