是什么?有什么用?用在什么地方?(理解)
养成良好的编程习惯;
培养编程思想;
写代码之前应该先分析需求,分析完需求再开始写代码;(写注释)
1.二维数组
1.1 二维数组的基本概念:
所谓多维数组就是一个一维数组的每个元素又被声明为一 维数组,从而构成二维数组. 可以说二维数组是特殊的一维数组。
示例
int a[2][3]
可以看作由一维数组a[0]和一维数组a[1]组成,这两个一维数组都包含了3个int类型的元素
1.2 二维数组的定义:
数组中的每一个元素又是一个数组, 那么这个数组就称之为二维数组
元素类型 数组名称[一维数组的个数][每个一维数组的元素个数];
元素类型 数组名称[行数][列数];
元素类型: 说明二维数组中每个一维数组存储什么类型的数据
一维数组的个数: 说明二维数组有多少个元素
每个一维数组的元素个数 : 说明二维数组中每一个一维数组的元素个数
*/
int scoress[3][5] =
{
元素类型 数组名称[行数][列数];
元素类型: 说明二维数组中每个一维数组存储什么类型的数据
一维数组的个数: 说明二维数组有多少个元素
每个一维数组的元素个数 : 说明二维数组中每一个一维数组的元素个数
*/
int scoress[3][5] =
{
{1, 3, 5, 7, 9}, // 0
{2, 4, 6, 8, 10},// 1
{1, 2, 3, 4 , 5} // 2
{1, 2, 3, 4 , 5} // 2
}; // 每一个一维数组都是二维数组的一个元素
如何遍历二维数组
思路: 1.取出二维数组的每一个元素(取出二维数组中的一维数组)
2.遍历一维数组
1.3 二维数组的存储
存储方式:
1)计算机会给二维数组分配一块连续的存储空间
2)数组名代表数组的首地址,从首地址位置,依次存入第1行、第2行、.....
3)每一行存储方式,从行首地址还是,依次存储行的第1个元素、第2个元素、第3个元素......
4)每个元素占用相同的字节数(取决于数组类型)
5)并且数组中元素之间的地址是连续
二维数组的存放顺序是按行存放的,先存放第一行的元素,再存放第2行的元素
1.4 二维数组初始化及注意点:
1.3.1二维数组的多种初始化方式
1.定义的同时初始化
int names[2][3] =
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
2.先定义再初始化
int names2[2][3];
names2[0][0] = 'l';
names2[0][1] = 'n';
names2[0][2] = 'j';
names2[1][0] = 'x';
names2[1][1] = 'm';
names2[1][2] = 'g';
names2[0][0] = 'l';
names2[0][1] = 'n';
names2[0][2] = 'j';
names2[1][0] = 'x';
names2[1][1] = 'm';
names2[1][2] = 'g';
3.完全初始化
int names3[2][3] =
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
4.不完全初始化
int names4[2][3] =
{
{'l', 'n'},
};
{
{'l', 'n'},
};
5.省略元素个数的两种写法
明确的告诉二维数组, 我们有2个一维数组
char names5[2][3] =
{
'l', 'n', 'j',
'x', 'm', 'g'
};
char names15[2][3] =
{
'l', 'n', 'j',
'x', 'm'
};
{
'l', 'n', 'j',
'x', 'm', 'g'
};
char names15[2][3] =
{
'l', 'n', 'j',
'x', 'm'
};
没有告诉二维数组我们有几个一维数组
如果在"定义的同时"进行初始化, 那么一位数组的个数可以省略
系统会自动根据每一个一维数组能够存放多少个元素, 自动根据初始化的值推断出二维数组中一共有多少个元素(多少个一维数组)
char names6[][3] =
{
'l', 'n', 'j',
'x', 'm', 'g',
'n', 'b'
};
char names6[][3] =
{
'l', 'n', 'j',
'x', 'm', 'g',
'n', 'b'
};
6.错误写法
⚠️ 注意点: 每个一维数组的元素个数不能省略
int names7[2][] =
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
{
{'l', 'n', 'j'},
{'x', 'm', 'g'}
};
搞不清楚应该分配多大的存储空间, 以及搞不清楚应该把哪些数据赋值给第一个数组, 以及哪些数据赋值给第二个数组
int names7[2][] =
{
'l', 'n', 'j',
{
'l', 'n', 'j',
'x', 'm', 'g'
};//错误写法
1.5 二维数组与函数
1.二维数组的元素作为函数参数
二维数组的元素就相当于变量,作为函数参数与变量相同
2.二维数组中的一维数组作为函数
二维数组的一维数组实际上就是一个一维数组,作为函数参数与一维数组相同
3.二维数组作为函数参数
**二维数组作为函数参数是地址传递**
二维数组作为函数形参,参数中一维数组的元素个数不可以省略
void test(char cs[2][]) // 错误写法
{
printf("我被执行了
");
}
void test(char cs[2][3]) // 正确写法
{
printf("我被执行了
");
}
void test(char cs[][3]) // 正确写法
{
printf("我被执行了
");
二维数组作为函数参数,在被调函数中不能获得其有多少行,需要通过参数传入。
```
void test(char cs[2][3])
{
int row = sizeof(cs);
printf("row = %zu
", row);
}
输出结果:
row = 8
```
- 二维数组作为函数参数,在被调函数中可以计算出二维数组有多少列
```
void test(char cs[2][3])
{
size_t col = sizeof(cs[0]);
printf("col = %zd
", col);
}
输出结果:
col = 3
```
以后只要看到函数的参数是一个数组, 那么就是地址传递
在函数中修改形参的值会影响到参数
2.字符串
1.字符串概念
字符串是位于双引号中的字符序列
在内存中以“ ”结束,所占字节比实际多一个
2.字符串的初始化
- 在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。前面介绍字符串常量时,已说明字符串总是以‘ ’作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符‘ ’存入数组,并以此作为该字符串是否结束的标志。有了‘ ’标志后,就不必再用字符数组 的长度来判断字符串的长度了。
- 初始化
```
char name[9] = "lnj"; //在内存中以“ ”结束,