1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 int main() 7 { 8 int m{1111}, n{2222}; 9 cout << "m的地址为: -> " << &m << endl 10 << "n的地址为: -> " << &n << endl << endl; 11 12 /* 指针数组 */ 13 int* b[2] = {&m, &n}; //创建匿名【指针数组】,b指向数组b的每一个元素 14 auto c = &b; // 创建指针c指向指针数组b第一个元素的地址 15 int** d = b; // 也可以使用auto d = b,二级指针 16 17 cout << "b指针存放结果:" << b << endl 18 << "b指针数组当前指向元素:" << *b << endl //*b == b[0] 19 << "b指针数组当前指向元素指向内容:" << *b[1] << endl << endl; 20 21 cout << "c指针存放结果:" << c << endl 22 << "c指针数组当前指向元素:" << *c << endl 23 << "c指针数组当前指向元素指向内容:" << *(*c)[1] << endl << endl; 24 25 cout << "d指针存放结果:" << d << endl 26 << "d指针数组当前指向元素:" << *d << endl 27 << "d指针数组当前指向元素指向内容:" << *d[1] << endl << endl; 28 29 /* 数组指针 */ 30 int list[2] = {m, n}; 31 int (*p)[2] = &list; //创建【数组指针】,指向数组list的第一个元素 32 33 auto q = p; //指针赋值, 浅拷贝,p为 “int (*)[2]”类型 34 cout << "p的内存地址为:" << p << " 指向元素:"<< (*p)[1] << endl 35 << "q的内存地址为:" << q << endl; 36 37 int x = 1; // 分配一块内存,标记为x,存放1,格式为 int* 38 int* y = &x; // 分配一块内存,标记为y,存放x的地址,格式为 int* 39 int** z = &y; // 分配一块内存,标记为z,存放x地址的地址,格式为 int** 40 int** v = z; // 指针浅拷贝 41 auto u = &y; // 同第三个,但是格式自动判断,指向关于x的指针y的存放地址 42 43 }
m的地址为: -> 0x7ffd33436d9c
n的地址为: -> 0x7ffd33436da0
b指针存放结果:0x7ffd33436df0
b指针数组当前指向元素:0x7ffd33436d9c
b指针数组当前指向元素指向内容:2222
c指针存放结果:0x7ffd33436df0
c指针数组当前指向元素:0x7ffd33436df0
c指针数组当前指向元素指向内容:2222
d指针存放结果:0x7ffd33436df0
d指针数组当前指向元素:0x7ffd33436d9c
d指针数组当前指向元素指向内容:2222
p的内存地址为:0x7ffd33436de8 指向元素:2222
q的内存地址为:0x7ffd33436de8
个人总结:
1. 数组指针和数组指针 (区分的重点在于括号 [ ] 优先级高于解除引用运算符*)
- 指针数组,是一个包含很多指针的数组,如:
int* b[2] = {&m, &n}; //有一个匿名【指针数组】,长度为2,格式为int,每一个元素都是一个指针,访问内容可以使用 *a[0]
数组指针,是指向数组的指针,如:
-
int list[2] = {m, n}; int (*p)[2] = &list; //创建【数组指针】,指向数组list的第一个元素,访问第一个元素用(*p)[0]
2. 关于*,**的理解
1 int x = 1; // 分配一块内存,标记为x,存放1,格式为 int* 2 int* y = &x; // 分配一块内存,标记为y,存放x的地址,格式为 int* 3 int** z = &y; // 分配一块内存,标记为z,存放x地址的地址,格式为 int** 4 int** v = z; // 指针浅拷贝 5 auto u = &y; // 同第三个,但是格式自动判断,指向关于x的指针y的存放地址