总结一下数组和指针的知识,分析一下它们之间的关系
好像是一点关系也没有,指针就是指针,数组就是数组。认为有关系的大都是写C语言书的作者强行把它们两者放到一起写吧,如果分开写,嗯,估计大家学起来可能会分的更清楚写吧,作为小白的我是这么认为的。
指针,在32位系统下面,指针变量都是占据4字节内存大小,指针里面存放的是一个内存的地址。
数组,大小等于元素的类型乘以元素个数。定义数组时候必须指定它的元素类型和个数,元素可以是任意类型包括指针,但是不能是函数。
一.数组基本知识:
1.一维数组
初始化
(1) int array[8] = {1, 2, 3, 4, 5, 6, 7, 8};
使用花括号括起来的一系列数值来初始化数组,数值之间用逗号隔开。
(2)int array[4] = {1, 2};
只初始化部分数组元素的话,未初始化的元素被设置为0,array[2]和array[3]为0
(3)char ch[8] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'};
初始化字符数组,如果改成char ch[9] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', ' '};则表示一个字符串数组(字符和字符串区别是后面有没有' ')
(4)初始化数组时候可以省略中括号的元素个数,让编译器来决定数组的大小,例如:
int array[] = {1, 2, 3, 4, 5, 6, 7, 8};编译器会自行确定数组大小
(5)指定某个特定的元素进行初始化,例如:
int array[6] = {[3] = 111};意思是把array[3]初始化为111.
特殊:int array[10] = {1, 2, 3, 4, [5] = 10, 11, 12, [1] = 90};则初始化的结果是array[10] = {1, 90, 3, 4, 0, 10, 11, 12, 0, 0};
(6)使用循环对数组赋值,常见的模板如下:
for(index = 0; index < SIZE; index++)
{
array[index] = index;
}
无效或者错误的数组赋值方式:C语言不支持把数组作为一个整体来赋值,除了初始化的时候外,C语言也不支持用花括号括起来的列表形式进行赋值。
#define SIZE 5
int main(int argc, char* argv[])
{
int array_1[SIZE] = {1, 2, 3, 4, 5};
int array_2[SIZE];
array_2 = array_1;//这种赋值方式是错误的
array_2[SIZE] = array_1[SIZE];//错误
array_2[SIZE] = {1, 2, 3, 4};//错误
return 0;
}
(7)编译器不会自动检查数组边界是否合法,使用超出数组边界值的索引会改变其他变量的数值,不同的编译器,输出结果会有一点差异。
2.多维数组
(1)二维数组的声明
int array[5][10];代表的含义是,array是一个包含5个元素的数组,每个元素的类型是int[10];也就是说,rain具有5个元素,并且每个元素都是包含10个int数值的数组。因此,总结有如下知识点:
array的首元素是array[0], array[0]是一个包含10个int数值的数组,同理array[1]和array[2],因为array[0]是数组,因此它的第一个元素是array[0][0], 第二个元素是array[0][1],其他元素以此类推。
概括来说,array是包含5各元素的数组(每个元素又是包含10个int元素的数组),array[0]是包含10个int类型的元素的数组.
(2)初始化二维数组
array[2][5] = {{.....}, {.....}};也可以去掉里面的大括号,二维数组的初始化同样遵循一维数组的规则。
二.数组和指针(待续....)