一、数组初始化
一维数组初始化:
一般形式:
类型名 数组名[数组长度] = {初值表};
例如:
int a [5] = {1, 2, 3, 4, 5};
1、当使用空的方括号对列表进行初始化时,编译器会根据列表中的数值数目来确定数目大小
例如:
int a [ ] = {1, 2, 3, 4, 5};等价于 int a [5] = {1, 2, 3, 4, 5};
2、当数值数目多于数组元素数目时,多与的数组元素会被初始化为0
int a [5] = {1, 2, 3}; a[3] = 0 a[4] = 0
二维数组初始化:
- int a[2][3] = {{5, 6}, {7, 8}};
5 | 6 | 0 |
---|---|---|
7 | 8 | 0 |
- int a[2][3] = {5, 6, 7, 8};
5 | 6 | 7 |
---|---|---|
8 | 0 | 0 |
二、数组与指针
一维数组与指针:
以int a [5] = {1, 2, 3, 4, 5};为例
-
数组名代表首位元素地址 a == &a[0];
-
a + 1; 代表什么?
首先确定a+1是地址,是指向下一个元素的地址,即a + 1 == &a[1]; -
* a + 1
与* (a + 1)
的区别
首先已知间接运算符*的优先级大于加号运算符+
*a + 1 先算 * a,取出a所指向地址(首元素)的值a[0] ==1; 接着加1,最后结果为2;
*(a + 1) 先算括号里面的 a + 1, -
total +=* a++ ;
和total += *++a;
区别* a++
一元运算符* 与++的优先级相同,但结合律是从右往左,所以a++先求值,然后才是* a ,也就是说,指针a先递增后指向(先把指针指向位置上的值加到total上,然后再递增指针);total +=* a++;
等价于total = *a
;a = a + 1
;total += *++a;
等价于a = a + 1
;total = *a
;- 注:C语言i++和++i的区别和指针*(a++)和*(++a)的区别
-
int a[3] = {1, 2, 3}; int *p =a;
*(a+i) == * (p + i) == a[i] == p[i]
二维数组与指针:
以int a [2] [3] = {{5, 6, 0}, {7, 8, 0}}; 为例,a数组是一个包含两个数组元素的数组,每个数组元素里面又包含3个int类型的元素。
简写为int a [2] [3] = { a[0], a[1] }; 其中a[0] = {5, 6, 0}; a[1] = {7, 8, 0};看成为一维数组
-
区别 a 与 a[0]
- 数组a是数组首元素地址,在本例中a是一个占用三个int类型大小对象的地址,而a[0]是一个占用三个int大小对象的地址,所以a == a[0] == &a[0][0];
-
区别a + 1;与a[0] + 1
- a是首元素地址,a+1是二维数组的第二个元素 {7, 8, 0} 的地址.
即a + 1== a [1] == &a[1][0]; - a[0]是数组 {5, 6, 0} 首个元素5的的地址,a[0] + 1指向数组 {5, 6, 0} 里面下一个元素6的地址。即a[0] + 1 == &a[0][1];
- a是首元素地址,a+1是二维数组的第二个元素 {7, 8, 0} 的地址.
-
*a、**a、*a[0]、
- int a [2] [3] = { a[0], a[1] }; 其中a[0] = {5, 6, 0}; a[1] = {7, 8, 0};
a是a[0]的地址,*a == a[0]。 - a[0]是数组 {5, 6, 0}中元素5的地址,*a[0] == 5; 即 **a == *a[0] == 5;
- int a [2] [3] = { a[0], a[1] }; 其中a[0] = {5, 6, 0}; a[1] = {7, 8, 0};
指向二维数组的指针如何表示?
在前面已经知道指向一维数组的指针可以表示为int *a[2]
(a是一个内含2个数组元素的数组,每个元素都指向int类型的指针),这是因为方括号[]的优先级比 * 高,由于方括号[]的优先级高,先与a结合,所以a是一个内含2个元素的数组,然后 * 表示a数组内含两个指针,最后,int表示a数组中的指针都指向int类型的值。
指向二维数组的指针可以表示为int (*a)[2]
(a指向一个内含两个int类型值的数组),根据优先级原则, * 先与a结合,因此声名的是一个指向数组(内含两个int类型的值)的指针。
- 如何表示一个二维数组中的元素?
仍然以 int a [2] [3] = {{5, 6, 0}, {7, 8, 0}}; 为例,要想表示元素7有哪些办法?- 数组表示法:a[1][0]
- 指针表示法:* ( * ( a + 1 ) + 0 ) 即 a [m] [n] = * ( * ( a + m ) + n )
三、变长数组(variable-length array可变长度数组)
定义: 允许使用变量表示数组的长度(C99新增特性)
例如:
int a = 4, int b = 2; double sales[a] [b];
缺点:
- 必须是自动存储类别,意味着无论在函数中声名还是作为函数参数声明,都不能使用static或extern存储类别说明符;
- 声明时不能初始化;
三、变长数组(variable-length array可变长度数组)
指针数组: 数组元素全为指针的数组,其本质是数组。例如int * p[15]
[ ] 的优先级比 * 的优先级高,p先与[]结合,形成数组p[15],有15个元素的数组,再与 * 结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
数组指针: 指向数组首元素的地址的指针,其本质为指针(这个指针存放的是数组首地址的地址,相当于2级指针,这个指针不可移动)例如int (* p)[15]
注:
- C规定,数组的维数必须是常量,不能用变量代替!!!