作为在校的一枚学生,在日常的学习过程中产生了很多问题并在思考后对这些问题有了一定的理解,在此一一记录下来
数组指针和指针数组
形如int *p[10]
是指针数组
- []的优先级高与,p先和[10]结合成一个数组,数组元素的类型是int*
- 数组指针中每个元素都是个指针,所以,指针数组名p相当与一个二级指针int **a,在函数传递参数时,就可以
int array(int **a)
在main中传递int *p[10] ;array(p);
形如int (*p)[10]
是数组指针
- 数组指针是一个指针指向一个数组,其中p是一个指针,p的类型是int(*)[10],p+1指向的值是4*10个字节(假设int类型是4个字节)
- 指针数组的函数传参可以直接用指针类型参数,但是要主要类型名更改之后+1操作之后,增加的字节数的区别
- int a[10],a代表的值是数组的首地址,那么&a的的值也是数组的首地址,但是两者的区别在与,a+1,代表之后4个字节,而,&a+1是之后的4*10=40个字节,&a代表的是整个数组的空间,对比第一条所诉,可分析出,数组指针类似与&a的意义
二维数组
在理解了数组指针和指针数组之后,我在分析二维数组时,又产生了新的问题,在数组指针和指针数组中数组名p一个可以理解为一个指向数组的指针,一个可以理解为一个二级指针,那么,二维数组名怎么理解呢?
int a[10][10] 起初我认为二维数组名a应该是一个二级指针,就如指针数组一般,二维数组*a就是指向数组的指针,那么**a就是数组的第一个值
但是后来,在网上查阅资料后,发现二维数组名可以理解为一个指向指针数组的指针 ,但是又不等于int **p,而是等于int (*p)[10]
,个人对这里还是很迷惑,希望有个能指点,并对我上面的看法错误的地方给予指出,万分感谢!