数组小结
1、数组的声明要指出:存储类型,数组名,数组大小
2、没有引用数组,因为引用已经初始化不能在改变,但是可以有数组引用,即数组的引用,可以用于函数实参传递。
3、关于数组的初始化,若不显式提供元素,对于内置类型数组,在函数体外元素被初始化为0,而在函数体内则不被初始化。对于非内置类型,则不管在哪里定义,都会调用默认构造函数进行初始化,若没有默认构造函数则报错。
4、使用C风格字符串的标准库函数时,参数必须以’\0’结尾。
5、C/C++中,二维数组按照行优先存储。
6、一个N*M的二维数组a[x][y]转化为一维数组表示时,为b[x*M+y]。
7、关于指针的运算,只有在同一个数组中的运算才有意义。
8、指针数组,是一个数组,装着指针。声明一个装有10个指针的数组int * a[10]。
9、数组指针,是一个指针,指向数组。指向一个装有10个整型的数组的指针 int (*p)[10],此时sizeof(p)为40。
10、二维数组的数组名是一个数组指针。int a[4][10]; int (*p)[10];p = a; sizeof(a)为40。
11、数组名为一个常量,不能对其赋值。
12、对于int a[10];&a是int (*) [10],而a是int *。
13、如果指针指向文字常量区,不能通过指针对其进行修改。
14、对于数组int a[4][5]:
a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
int |
(1)a:类型为 int (*)[5],即a为指向数组a第0个元素a[0]的地址,a等价于&a[0]。&a+1跳20个元素。
(2)*a或a[0] 类型为int*,*a指向数组a[0]的首元素a[0][0]。
(3)*(a+1)或a[1] 类型为int *,a类型为int(*)[5],即a指向有5个元素的一维数组,故a+1跳过5个元素。
(4)*(*(a+1)+2) 是int型 ,指向的元素是a[1][2]。
总结:
&a的类型为int(*)[5];
a+i的类型为int(*)[5];
*(a+i)为int *;
*(*(a+i)+j)为int;
*(a+i) = a[i];
*(*(a+i)+j)=*(a[i]+j)=a[i][j]。
15、线性表的位序从1开始,而数组元素的下标从0开始。