以下各类指针与数组,哪些指针与数组名等价?
如对于
int (*p)[2];
int a[3][2];
p=a;
p+i等价于a+i;
p[i][j]等价于a[i][j];
指针与数组名等价的本质是什么?
int *m;
int (*n)[2];
int *p[2];
int a[10];
int b[3][2];
char c[10];
都是地址,指针是地址变量,数组名是地址常量,一级指针与一维数组等价,但是二级指针与二维数组不等价,因为二维数组指向数据,二级指针指向指针,不过二维数组可以看作与指针数组等价
大家可能对于指针还是一个模糊的概念,下面我给大家讲解一下什么是指针:
指针是一个用于存储内存地址的变量;
比如说大家可能听说过指针变量
:char * p=&a(假设已经存在了变量a,&a拿出a的内存地址);
那么上面也就是拿出了a的内存地址存储于指针变量p中;
指针变量类型--常用的:double(8个字节),float(4个字节),long(4个字节),int(4个字节)
例如:
int arr[10]={0};
int * p=arr;(数组是可以直接拿出内存地址,但是这个内存地址,指的是数组首元素的内存地址);
p+1;(这里的的+1不是地址值+1而是跨越一个int类型的字节大小);
大家注意这里,为什么我给指针变量p+1后就由DC变成了E0呢(这里是使用16进制进行存储的可以参考我的另一篇文章,对于16进制的一些讲解);
因为加一后就跨越了一个int的大小的区域,也就是4个字节,所以就+4,所以根据16进制的运算导致了DC转换成为了E0;
指针的 ' * ' 这个东西又是干什么的呢?
这个在定义的时候是用于标识指针变量用的;
比如int a=9;
int * b=&a;
上者是一个整数类型的变量,下者是一个存储整数a的内存地址的int类型的指针变量
大家注意一点:
变量拿出内存地址需要&符号
数组拿出内存地址是直接用数组名(注意,通过数组名拿出来的是首元素的内存地址)