c/c++关于指针的一点理解


 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的存放地址
原文地址:https://www.cnblogs.com/geoffreyone/p/9817079.html