# c语言个人笔记
==E.menos==
==代码规范性!!!==
* 如何看懂一个程序?
1. 流程
2. 每个语句的功能
3. 试数
## 五. 数组
### 5.1 数组(不作为学习重点)
+ 为什么需要数组
1. 解决大量同类型数据的存储和使用问题
2. 模拟现实世界( 一维 二维 三维 )
```c
# include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
//a是数组的米棒子, 5表示数组的个数, 这五个元素分别用a[0] - a[4]表示
int i;
for(i=0; i<5; ++i)
printf("%d\n",a[i]);
//a[i]表示第 i+1 个元素
return 0;
}
```
数组不作为学习的重点:数组长度是个死值且缺少很多功能(需要编程别的代码);故原始数组用处不多
### 5.2 数组的分类
+ 一维数组
1. 定义
+ 为n个变量连续分配存储空间
+ 所有变量的类型必须相同
+ 所有变量所占字节必须相等
2. 操作
+ 初始化
+ 完全初始化
int a[5] = {1,2,3,4,5};
+ 不完全初始化
int a[5] = {1,2,3};
不完全初始化,未被初始化的元素为0
*不初始化,所有的元素都是垃圾值*
*int a[5];p*
+ 清零
q int a[5] = {0};
+ 错误写法
```c
int a[5];
//定义时的“5”是指个数,定义后出现的“5”时是下标
a[5] = {1,2,3,4,5};
```
只有在定义数组的同时才可以整体赋值
其他情况下整体赋值都是错误的
```c
int a[5]={1,2,3,4,5};
a[5] = 100; //error 因为没有a[5]这个元素,最大是a[4]
```
```c
int a[5] = {1, 2, 3, 4, 5};
int b[5];
//要把a数组的元素全部赋值给b数组
//错误写法: b = a;
//正确写法:
for (i=0; i<5; ++i)
b[i] = a[i];
```
一维数组名不代表数组中的所有的元素
一位数组名代表数组第一个元素的地址
+ 赋值
+ 排列
+ 求最大/小值
+ 倒置
+ 查找
+ 插入
+ 删除
+ 二维数组
```c
int a[3][4];
//共有12个元素,看作三行四列,元素的名字分别为
//a[0][0] a[0][1] a[0][2] a[0][3]
//a[1][0] a[1][1] a[1][2] a[1][3]
//a[2][0] a[2][1] a[2][2] a[2][3]
//a[3][0] a[3][1] a[3][2] a[3][3]
//a[i][j]表示第i+1行 第j+1列的元素;
//int a[i][j]:该二维数组右下角位置的元素只能是a[i-1][j-1];
```
```c
初始化:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
```
操作:输出二维数组内容
```c
#include <stdio.h>
int mian(void)
{
int a[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
//输出二维数组内容
for (i=0; i<3; ++i)
{
for (j=0; j<4; ++j)
printf("%d\n",a[i][j]);
printf("\n")
}
}
```
+ 多维数组
+ 是否存在多维数组
不存在
因为内存是线性一维的
**n维数组可以当做每个元素是n-1维数组的一维数组**
比如
int a[3][4];
该数组是含有三个元素的一维数组
只不过每个元素都可以再分成4个小数组
int a[3][4][5];
该数组是含有三个元素的一维数组
只不过每个元素都是4行五列的二维数组