何为数组
一段连续的空间(明确告诉编译器,一共有多少块空间) 用来相同类型的数据
数组的名字是给用户看的,在实际的内存中是用地址寻找
访问元素通过数组下标,数组下标从0开始
数组都是顺序存储
数组名是首元素的地址
一维数组
int array1[3]&#61;{1,2,3};//静态初始化int array2[3];//动态初始化 用于遍历输入和输出for(int i&#61;0;i<3;i&#43;&#43;){array2[i]&#61;1;}for(int j&#61;0;j<3;j&#43;&#43;){printf("%d\n",array[j]);}int array3[3]&#61;{[1]&#61;2,3};//指定初始化
指定初始化时会延顺赋值&#xff0c;越界不报错
有个别元素初始化时&#xff0c;其他默认为0
二维数组
实际内存上不是矩阵&#xff0c;而是一维数组的嵌套
array01[3]中存放三个&#xff08;一维数组&#xff09;序列相应的地址,本质上就是指针&#xff0c;存放指向三个数组的地址&#xff08;指向三个地址&#xff09;
int array01[3][3] &#61; {//二维数组静态初始化{1,2,3},{7,8,9},{4,5,6}};for (int i &#61; 0; i <3; i&#43;&#43;) {//二维的遍历for (int j &#61; 0; j <3; j&#43;&#43;) {printf("%d\n", array01[i][j]);
指针
指针指向某个变量&#xff08;具体空间&#xff09;即指针变量中存放了这个变量&#xff08;具体空间&#xff09;的地址
地址按照字节编制的,地址就是16进制
指针使用要初始化&#xff0c;但不是单纯赋值&#xff0c;而是指向具体空间
野指针&#xff1a;有指向空间的,但是是乱指
空指针&#xff1a;指的NULL&#xff0c;用于判断&#xff0c;多一步判断就是为程序的健壮性&#xff0c;例如数据边界问题
//错误示范int *p;*p&#61;5;//因为这个5不知道存放在哪&#xff0c;有可能修改了内部数据&#xff0c;所以视为非法访问//正确示范int a;//有具体空间int* p1&#61;&a;*p1&#61;5;
数组与指针的联系
在array[3]&#61;{2,4,6};中有两种方法找到4这个元素&#xff1a;一种是通过数组下标array[1],二是*(p&#43;1),本质都是通过索引
array[3]&#61;{2,4,6};
array[1]
*(p&#43;1)
理解指针类型的作用(为什么指针要有类型)
int array&#61;{1,3,5};int *p&#61;array;printf("%d\n",*p&#43;1);//结果为2printf("%d\n",(*p&#43;1));//结果为2printf("%d\n",(*p)&#43;1);//结果为2printf("%d\n",*(p&#43;1));//结果为3//本质区别在于*和&#43;的优先级关系//但是为什么p&#43;1能指向下一个格子呢&#xff1f;在于指针有类型//所以指针类型的作用&#xff1a;方便移动&#xff0c;即&#43;1之后找到相同类型的数据&#xff08;比如int类型4个字节 double类型8个字节&#xff09;//所以此例中地址&#43;1 实际上是增加一个int类型的存储单元//所以array&#43;4<&#61;>&array[2]
数组即指针&#xff08;通过二维数组来理解&#xff09;
int array[3][3] &#61; {//二维数组{1,2,3},//为什么说array[3]中存放三个&#xff08;一维数组&#xff09;序列相应的地址&#xff1f;{7,8,9},{4,5,6}};int(*p)[3];//二维数组的另一种表达p&#61;array;
利用降维思想来理解
指针指向普通变量
int a&#61;5; int*p&#61;&a&#xff1b;
p指向a这个具体空间
即p的空间存放a空间的地址
即p&#61;&a
即*p时&#xff0c;找到p中放有的地址的值&#xff08;找到这个空间有什么&#xff09;
指针指向一维数组
int array[3]&#61;{4,5,6};int* p&#61;array;
由数组名是首元素地址
p指向4这个元素&#xff0c;是指向一个int类型的值&#xff08;空间&#xff09;
int
即*p时&#xff0c;找到首元素4&#xff0c;当array[0]时&#xff0c;也能找到首元素4
*p
array[0]
所以*p与array[0]等价
所以*p&#43;1与array[1]等价
*p&#43;1
指针指向二维数组
int array[2][2] &#61; {{5,6},{7,8}};int (*p)[2];p&#61;array;
由数组名是首元素的地址
数组名array是array[0]的地址&#xff0c;即array存放array[0]的地址&#xff0c;即array指向array[0],并且array[0]是包含两个int的一维数组&#xff0c;所以array指向两个int大小的空间(此时把array[0]当作数组来理解)
array
可以令array[0]为array1&#xff0c;则一维数组简化为array1[3]
array1
array1[3]
数组名array1则为array[0][0]的地址&#xff0c;则数组名array[0]则为array[0][0]的地址,即array[0]存放array[0][0]的地址&#xff0c;即array[0]指向array[0][0],并且array[0][0]包含一个int的单个元素&#xff0c;所以array[0]指向一个int大小的空间(此时把array[0]当作指针来理解)
array[0][0]
array&#61;&#61;&array[0]array[0]&#61;&#61;&array[0][0]**array&#61;&#61;*array[0]&#61;&#61;array[0][0]//所以只能说明始于同一个地址&#xff0c;但是指向空间大小不一样//所以在&#43;1移动时得到不同的值
所以*p是指向包含两个int大小的空间
printf("%d\n",**p&#43;1);//结果为6printf("%d\n",*(*p&#43;1));//结果为6printf("%d\n",**(p&#43;1));//结果为7结构体