具体的https://mjios.cnblogs.com/archive/2013/03/15/2961147.html#label0
一、地址
1.计算机中的内存是以字节为单位的储存空间。内存的每一个字节都有一个唯一的编号,这个编号就成为地址。
二、一维数组
1、定义
- 定义的形式: 类型 数组名[元素个数]
int a[5];
- [ ]里面的个数必须是一个固定值,可以是常量(比如6,8),常量表达式(比如3+4 、5*5)。绝对不能使用变量或多数情况下不要省略元素个数(当数组作为函数的形参和数组初始化时以外)。
正确
int a[4];//整数常量
int b['A'];//字符常量,其实就是65
int c[3*4];//整型常量表达式
************************
错误
int a[];//没有指定元素个数,错误
int i = 9;
int a[i];//用变量做元素个数,错误
2.一维数组的储存
- 定义数组时,系统将按照数组类型和个数分配一段连续的储存空间来储存数组元素
- 第一个元素的地址就是整个数组的地址
- 数组名代表整个数组的地址,也就是数组的起始地址。
3.一维数组的初始化
- 初始化的一般形式是:类型 数组名[元素个数] = {元素1,元素2,…};
int a[2]={8,10};
//其实相当于
int a[2];
a[0] = 8;
a[1] = 10;
注意:C语言中编译器是不会对数组下标越界进行检查的
,所以自己访问数组元素时要小心
- 元素值列表可以是数组可以是数组所有元素的初值,也可是前面部分元素的初值。当数组为整型时,初始化未确定初值的元素,默认为零
int a[4]={2,5};
- 当对全部数组元素都赋初值时,可以省略元素个数
int a[]={2,5,8};
- 数组初始化时的赋值方法只能用于数组的定义,定义后只能一个元素一个元素地赋值
1 int a[3];
2 a[3] = {1, 2, 3}; // 错误
3 a = {1, 2, 3}; // 错误
其实为什么是错误的写法呢?我们可以简要分析一下。
1> 第2行的a[3]代表着访问数组的第4个元素,首先这里已经是数组下标越界了;就算没有越界,给a[3]赋值时也应该赋一个int类型的整数,不应该是{}。
2> 第3行的a是数组名,代表着数组的地址,它是个常量!给常量赋值,那肯定错了!
4.一维数组与函数
- 一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,数组元素的值传给形参,形参的改变不影响实参
// b是test函数的形参(形式参数)
void test(int b) {
b = 9;
}
int main()
{
int a[3];
a[0] = 10;
printf("函数调用前的a[0]:%d\n", a[0]);
test(a[0]); // a[0]是test函数的实参(实际参数)
printf("函数调用后的a[0]:%d", a[0]);
return 0;
输出的结果:函数调用前的a[0]:10
函数调用前的a[0]:10
- 大家都知道,数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一个数组。这样的形参数组修改时,实参数组也同时被修改了。形参数组的元素个数可以省略。
// b是test函数的形参(形式参数)
void test(int b[]) { // 也可以写int b[3]
b[0] = 9;
}
int main()
{
int a[3];
a[0] = 10;
printf("函数调用前的a[0]:%d\n", a[0]);
test(a); // a是test函数的实参(实际参数)
printf("函数调用后的a[0]:%d", a[0]);
return 0;
输出的结果:函数调用前的a[0]:10
函数调用前的a[0]:9
二、二维数组
- 定义:类型 数组名[行数][列数]
int a[2][3];//共2行3列,6个元素
2.储存
- C语言把二维数组当作是一维数组的集合,即二维数组是一个特殊的一维数组:它的元素是一维数组。
- 二维数组的存放顺序是按行存放的,先存放第一行的元素,再存放第2行的元素
- a[0]、a[1]也是数组,是一维数组,而且a[0]、a[1]就是数组名,因此a[0]、a[1]就代表着这个一维数组的地址
3.初始化
-
按行进行初始化
-
按存储顺序进行初始化(先存放第1行,再存放第2行)
-
对部分元素进行初始化
int a[2][3] = { {2, 2, 3}, {3, 4, 5} };
int a[2][3] = {2, 2, 3, 3, 4, 5};
int a[2][3] = { {2}, {3, 4} };
int b[3][3] = { { }, { , , 2}, {1, 2, 3}};
- 如果只初始化了部分元素,可以省略行数,但是不可以省略列数
int a[][3] = {1, 2, 3, 4, 5, 6};
int a[][3] = {{1, 2, 3}, {3, 5}, {}};