数组指针与指针数组

数组与指针是个难弄的问题,要想搞明白这点,有两个要点

第一、[]算符的优先级是高于*算符的;

第二、理解指针声明语句的意思,可以从*p代表什么意思的角度来理解声明语句的意思。见如下代码里的注释:

1.数组指针——指向数组的指针

//指向数组的指针
    int *a0    ; //1 a0相当于一维数组名  2 *a0为第0个数组元素的值  3 先a0++,再*a0相当于第1个数组元素的值
    int (*a1)[3];//[]算符的优先级要高于*算符,所以要加括号。意思是*a1为一个三个元素的int数组,因此a1为指向一维数组的指针,因此a1可以被当做二维数组来使用
    int (*a2)[7][8];//意思是*a2为一个7x8的二维数组,因此a2为指向二维数组的指针,因此a2可以被当做三维数组来使用
//赋值方法如下: a0=new int[10]; a1=new int[2][3]; a2=new int[6][7][8]; //注:以上a0、a1、a2都不能用,因为new出来的变量不会初始化,里面是不确定的值。

2. 指针数组——装着指针的数组

//装着指针的数组
    int *b0[10];  //[]算符的优先级要高于*算符,故等价于int *(b0[10])。b0是个10个元素的一维数组,每个元素都是个int指针。
    int *b1[2][3];//b1是个2x3的二维数组,每个元素都是个int指针
//初始化方法如下
    int x=100;int *p=&x;
    for(int i=0;i<10;i++)
        b0[i]=p;
    for(int i=0;i<2;i++)
        for(int j=0;j<3;j++)
            b1[i][j]=p;

3. 混合使用

 //混合使用
    int **c0[10];//c0是个一维数组,数组的每个元素都是int **类型的,即数组的每个元素都是指向int指针的指针。
    int *(*c1)[10];//声明语句的意思是*c1是int *[10]类型的,即*c1是个指针数组,故c1是个指向指针数组的指针。
    //初始化方法如下
    int x=100;int *p=&x;int **p1=&p;
    c0[6]=p1;
    c1=&b0;
原文地址:https://www.cnblogs.com/james6176/p/2760839.html