Skip to content

原始指针

参考:

C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)

二维数组与指针、指针数组、数组指针的用法

指针存储的是什么?

指针存储的是所指向对象的地址值,如下所示

template<typename T, typename U>
void func(T t, U u) {
    cout << (void *) t << endl;
    cout << *t << endl;
    cout << u << endl;

    cout << sizeof(t) << endl;
    cout << sizeof(u) << endl;
}

int main() {
    int a = 3;
    int *pa = &a;

    char c = '3';
    char *pc = &c;

    func(pa, a);
    func(pc, c);
}

输出如下:

0x7ffeca32df24
3
3
8
4
0x7ffeca32df23
3
3
8
1

从结果可知

  • 指针pa指向整型变量a,保存的是a的地址
  • 指针pc指向字符变量c,保存的是c的地址
  • 指针papc的内存大小均为8字节

一维指针

一维指针可以指向单个对象或者一维数组对象

int main() {
    const int LENGTH = 10;
    int *p = new int[LENGTH];
    for (int i = 0; i < LENGTH; i++) {
        p[i] = i + i;
        cout << p[i] << " ";
    }
    cout << endl;
    delete[] p;
}

通过new关键字得到一组连续的内存空间,所以指针可以通过数组方式进行访问

二维指针

二维指针是指向指针的指针,所以二维指针的每个变量指向一个一维指针

    const int WIDTH = 3;

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

    int **p2 = &p1;
    cout << p1 << endl;
    cout << p2 << endl;
    cout << *p1 << endl;
    cout << *p2 << endl;
    delete[] p1;

在上面实现中,一维指针p1新建长度为WIDTH的整型数组,二维指针p2指向了一维指针p1

  • p1保存的是第一个整型变量的内存地址
  • 二维指针p2保存的是一维指针p1的内存地址
  • *p1得到的是第一个整型变量值
  • *p2得到的是第一个一维指针的内存地址,也就是*p2=p1

结果如下:

1 2 3 
0xd04c20
0x7ffc769c22e8
1
0xd04c20

上面的二维指针p2长度为1,下面使用p2实现长为5,宽为3的整型数组

    const int LENGTH = 5;
    const int WIDTH = 3;

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

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

结果如下:

1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7
  • 为二维指针p2新建一维指针数组,上式等同于int *(*p2) = new int*)[WIDTH]
  • 依次为一维指针p1 = *(p2+i)新建一维数组
  • 赋值每个位置并打印
  • 依次删除每个一维指针
  • 删除二维指针

三维指针

同理,三维指针是指向二维指针的指针,每个三维指针保存的是二维指针的地址值

    const int LENGTH = 5;
    const int WIDTH = 3;
    const int HEIGHT = 4;

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

    for (int i = 0; i < HEIGHT; i++) {
        for (int j = 0; j < WIDTH; j++) {
            delete[] *(*(p3 + i) + j);
        }
        delete[] *(p3 + i);
    }
    delete[] p3;
  • 3维数组p3新建二维指针数组
  • 依次为p3每个位置新建一维指针数组
  • 依次为每个一维指针数组新建一维数组
  • 赋值并打印
  • 以相反顺序删除内存空间

结果如下:

1 2 3 4 5 
2 3 4 5 6 
3 4 5 6 7 

2 3 4 5 6 
3 4 5 6 7 
4 5 6 7 8 

3 4 5 6 7 
4 5 6 7 8 
5 6 7 8 9 

4 5 6 7 8 
5 6 7 8 9 
6 7 8 9 10