一维数组
步骤
1,声明
语法:
Cextern 数据类型 数组名[长度];
注意:
- 可有可无
- 长度此时可以忽略不写
2,定义与初始化
- 系统自动初始化
bash# 数据类型 数组名[长度];
注意:
全局变量数组中的值为0
局部变量数组中的值为随机数
不建议使用
- 部分初始化
bash# 数据类型 数组名[长度] = {值1,值2,值3,....};
注意:
此时值的个数小于长度
将值从下标0的位置开始依次存储到数组中,剩余位置用0填充
特殊情况:将数组中所有数据制0
- 全部初始化
bash数据类型 数组名[长度] = {值1,值2,值3,....};
注意:
此时值的个数等于长度,将值从下标0的位置开始依次存储到数组中
此时长度可以忽略不写
- 间隔初始化
C数据类型 数组名[长度] = {[下标] = 值,[下标] = 值,...};
注意:
将指定位置的元素修改为指定的值
不建议使用
注意:不能将一个数组赋值给另一个数组
3,使用
取值
bash# 数组名[下标]
存值
bash# 数组名[下标] = 值;
长度
int 长度 = sizeof(数组名) / sizeof(数组名[0]);
int 长度 = sizeof(数组名) / sizeof(数据类型);
遍历
将数组中的数据逐个取出
cfor(int i = 0; i < len; i++) { 数组名[i]; }
二维数组
步骤
1,声明
语法:
bash# extern 数据类型 数组名[长度]; 注意: 1, 可有可无 2, 长度此时可以忽略不写
2,定义与初始化
2.1 全部初始化
bash方式A #数据类型 数组名[长度1][长度2] = { # {值1,值2,值3,...}, # {值1,值2,值3,...}, # {值1,值2,值3,...}, # ... # }; 方式B # 数据类型 数组名[长度1][长度2] = {值1,值2,值3,...,值1,值2,值3,...,值1,值2,值3,...,...}; 注意: 1 此时值的个数等于长度,将值从下标0的位置开始依次存储到数组中 2 此时长度可以忽略不写
2.2 部分初始化
bash# 间隔初始化 数据类型 数组名[长度1][长度2] = { {值1,值2,值3,...}, {值1,值2,值3,...}, {值1,值2,值3,...}, ... }; # 部分初始化 数据类型 数组名[长度1][长度2] = {值1,值2,值3,...,值1,值2,值3,...,值1,值2,值3,...,...}; 注意: 1 此时二维数组中一维数组的个数小于长度1 或一维数组中值的个数小于长度2
3 使用
c//取值 数组名[下标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] } }
一维字符数组
cchar str [长度] = {'h','e','l','l','o','w','o','r','l','d'}; char str [长度] = "helloworld"; 注意: ""的字符数组默认系统自带\0 printf打印字符串时遇\0结束 可以直接使用printf打印一维字符数组 不能使用printf打印其他一维数组
注意:
markdown> scanf输入字符数组遇空格或回车结束 > gets会导致数组下标越界 > fgets建议使用 fgets(数组名,sizeof(数组名),stdin);
二维字符数组
cchar strs[][50] = {"张三","李四","王五"}; for(inti=0; i < sizeof(strs) / sizeof (strs[0]) ;i++){ printf("%s\n",strs[i]); }
数组与函数
数组作为参数
数组作为参数进行传递时,传递的是数组中第一个元素在内存中的地址
64位机地址长度位 8 字节
32位机地址长度位 4 字节
基本数据类型的变量传递的是值,数组传递的地址
数组作为返回值
其实就是返回会一个地址
但是因为返回值类型不能写数组,所以返回指针
注意:
局部变量随着所在函数的调用生成,随着所在函数的执行完毕而销毁
所以将局部变量的地址传递出来后,该局部变量被系统回收后,
该地址的值为空,此时使用该地址操作就好出现段错误