1. 先说明第一个问题:[]的优先级比*要高
  2. int *p1[n];是一个指针数组,是一个存储指针的数组,含有多个指针。
  3. int (*p)[n];是一个数组指针,是一个指向一维数组的指针,只有一根指针。
  4. 示意图如下:数组指针、指针数组和指针的指针区别
  5. 在这里我们用一段代码就可以说明数组指针和指针数组的区别
#include<iostream>
using namespace std;

int main(){
    int *p=new int[5]{2,3,4,5,6};
    int **pp1=&p;
    int **pp2=new int*[5];
    for(int i=0;i<5;++i)
        pp2[i]=&p[i];
    cout<<"pp1[0]的地址:"<<pp1[0]<<" pp2[0]的地址:"<<pp2[0]<<endl;
    cout<<"pp1[0]的地址指向的值:"<<*pp1[0]<<" pp2[0]的地址指向的值:"<<*pp2[0]<<endl;
    cout<<"pp1[1]的地址:"<<pp1[1]<<" pp2[1]的地址:"<<pp2[1]<<endl;
    cout<<"pp1[1]的地址指向的值:"<<*pp1[1]<<" pp2[1]的地址指向的值:"<<*pp2[1]<<endl;
    return 0;
}

运行结果如图所示,虽说数组本身就是一根指针,我们可以用访问数组的方式去访问指针,但是由于数组指针只有一根指针,所以pp1[1]所访问的值已经不是目标值了
数组指针、指针数组和指针的指针区别
6. 二维数组可以看成是一维数组,此一维数组里面的每个元素都是一个数组,而数组名是一个地址,所以我们传递参数时接收的形参就要求为指针。
7. 指针里面存储了地址以及类型,并不是我以前以为的只有地址

C语言里面的定义的指针,它除了表示一个地址,它还带有类型信息。这个类型信息,用来告诉你,在这个地址空间上,存放着什么类型的变量。打个比如,有如下的代码片段:
int a;
int *p = &a;
假设p的指针值为0x08004000,并且int类型长度为4字节。
那么p将告诉你,[0x08004000, 0x08004004) 内存空间上存放着一个int类型。
如果你只从0x08004000地址中,只读取两个字节,那是错误的。

  1. 指针的指针是个什么玩意

int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;

int **ipp = &ip1;

数组指针、指针数组和指针的指针区别

  1. 数组指针(也就是数组)实际上也是属于指针的指针,只不过数组指针的第二根指针里面记录了它所指向的数据类型,而指针的指针就没有这个,只是单纯的说明这是根指针,但没有说明是根什么指针。
    详情请看这里参数传递二维数组
//以下方法就可以正确传递二维数组
int n=10;
int m=10;
int **p=new int*[m];//指向了指针数组
p[0]=new int[n*m];
for(int i=0;i<10;++i)
	p[i]=p[i-1]+m;//指定下标寻址方式

相关文章: