指针数组和数组指针

参考:C语言指针数组和数组指针

  • 指针数组是数组,数组中的每个成员是指针,其所占内存字节数由数组大小决定
  • 数组指针是指针,即指向数组的指针,其所占内存字节数固定(64位系统下为8字节)

声明

指针数组声明:长度为LENGTH的保存int类型指针的数组

int *p[LENGTH];

数组指针声明:指向长度为LENGTH的数组的指针

int (*p)[LENGTH];

由于运算符的优先级,所以先执行p[],再执行*p

  • 对于指针数组而言,声明了int*类型的p[LENGTH]数组
  • 对于数组指针而言,声明了int[]类型的*p指针

所占内存

    const int LENGTH = 3;
    const int WIDTH = 2;

    int arr[LENGTH] = {1, 2, 3};
    int *p[LENGTH];
    int (*p2)[LENGTH];

    cout << sizeof(p) << endl;
    cout << sizeof(p2) << endl;
}

数组长度为3,所以指针数组p的内存大小为8*3=24,数组指针p2的内存大小为8

赋值

指针数组

    const int LENGTH = 3;
    const int WIDTH = 2;

    int *p[WIDTH];

    for (int i = 0; i < WIDTH; i++) {
        p[i] = new int[LENGTH];
        for (int j = 0; j < LENGTH; j++) {
            p[i][j] = i + j + 1;
            cout << p[i][j] << " ";
        }
        cout << endl;
    }

    for (int i = 0; i < WIDTH; i++) {
        delete[] p[i];
    }

指针数组p的长度为WIDTH

  • 首先为每个成员指针新建内存空间,长度为LENGTH
  • 再进行赋值/取值操作
  • 最后遍历整个数组,依次销毁内存空间

数组指针

    const int LENGTH = 3;
    const int WIDTH = 2;

    int (*p)[LENGTH][WIDTH]={};
    int arr[LENGTH][WIDTH]={};

    cout << p << endl;
    p = &arr;

    for (int i = 0; i < LENGTH; i++) {
        for (int j = 0; j < WIDTH; j++) {
            arr[i][j] = i + j + 1;
        }
    }

    for (int i = 0; i < LENGTH; i++) {
        for (int j = 0; j < WIDTH; j++) {
            cout << (*p)[i][j] << " ";
        }
        cout << endl;
    }

数组指针p声明为int[LENGTH][WIDTH]类型,声明后其地址为0,所以需要将二维数组arr的地址赋值给p

0
1 2 
2 3 
3 4