各类指针与数组名的联系

以下各类指针与数组,哪些指针与数组名等价?
如对于

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];

都是地址,指针是地址变量,数组名是地址常量,一级指针与一维数组等价,但是二级指针与二维数组不等价,因为二维数组指向数据,二级指针指向指针,不过二维数组可以看作与指针数组等价

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/344868
  • 这篇博客也不错, 你可以看下一维数组数组名含义解析,数组指针的使用
  • 除此之外, 这篇博客: 指针以及二级指针和数组名转换指针的讲解中的 一.指针的讲解 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 大家可能对于指针还是一个模糊的概念,下面我给大家讲解一下什么是指针:

    指针是一个用于存储内存地址的变量;

    比如说大家可能听说过指针变量

    :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类型的指针变量

    大家注意一点:

    变量拿出内存地址需要&符号

    数组拿出内存地址是直接用数组名(注意,通过数组名拿出来的是首元素的内存地址)

  • 您还可以看一下 刘伶华老师的软件测试经典面试题剖析课程中的 你觉得作为一名软件测试工程师,应该要具备什么素质?小节, 巩固相关知识点