• 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的存放地址
  • 相关阅读:
    区别是否是 微信浏览器 ?
    添加收藏
    函数调用那点事
    移动端返回上一页,刚需!document.referrer 详解
    蓝桥杯-乘积尾零
    printf不能直接输出string类型
    bitset的简单用法
    to_string()函数(C++)
    蓝桥杯-明码
    手写C语言字符库
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9817079.html
Copyright © 2020-2023  润新知