目录
指针数组
数组内存放的是指针,而数组的类型也需要明确数组内元素为指针,例:
而其他类型的指针数组也类似:char*,short*...
我们也知道,数组名是首元素地址那么我们能否在指针数组内存放数组呢:
这样也是可以的,那么我们能否模拟出一个二维数组?
答案是肯定的,但是为什么在打印的时候要写出arr[ i ] [ j ]呢?
因为arr[ i ][ j ]和*(arr[ i ] + j)是等价的,arr[ i ]与*(arr + i)也是等价的
数组指针
类比:
整型指针:指向整型的指针
int a=0;
int* pa=&a;
字符指针:指向字符的指针
char b=0;
char* pb=&b;
数组指针:指向数组的指针
int arr[10];
int (*parr)[10]=&arr;
数组指针与数组首元素指针的区别
数组指针也就是数组的指针,存放的是数组的地址,我们知道数组名会隐式类型转换成数组首元素地址(在sizeof和&后不会转换),那这个数组的地址和数组首元素地址有什么不同?
由图可知,在地址值上首元素地址和数组的地址是完全一样的
当我们给他们各加1的时候,数组首元素地址加了4,而数组地址则加了16进制的28,也就是40,arr数组的地址和首元素地址为什么加1后不一样?原因在于他们的类型不同,数组的首元素地址的类型是 int* 而数组的地址则是 int (*)[10],数组首元素地址+1跳过的是一个元素,数组的地址+1跳过的是整个数组
数组首元素地址可以精确访问到每一个元素,使用数组却不行,那么数组指针有什么用处呢?
数组指针的使用(使用频率并不高)
在使用一维数组时传参,形参可以写成地址的形式也可以写成数组的形式,那么二维数组是如何传参的
在此之前先简单了解一下二维数组
int arr[2][3] = { 1,2,3,4,5,6 };
2表示行,3表示列
行可省略,列不可省略
数组名也表示首元素地址
数组首元素地址就是第一行的地址,是一个一维数组的地址
二维数组可以看成一个一维数组的数组
使用数组指针:
由图可知,函数在接受二维数组的参数是接受的是一个一维数组的地址
数组参数和指针参数(总结)
就俩字:上图
一维数组
一维数组传参,形参可以是指针也可以是数组,当形参是指针时需要注意类型
二维数组
二维数组传参,形参可以是数组也可以是指针
如果是数组,行可以省略,列不可省略
如果是指针,传过去的是第一行的指针,所以应该是指针数组
一级指针
当形参是一级指针时,我们可以给它传什么参数?
二级指针
最后,祝各位道友早日突破/进阶