原始指针
参考:
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
的地址 - 指针
pa
和pc
的内存大小均为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