当前位置 博文首页 > qq262593421的博客:C\C++中运算符& * *& **&的区别

    qq262593421的博客:C\C++中运算符& * *& **&的区别

    作者:[db:作者] 时间:2021-08-29 22:23

    符号分析

    &:取地址运算符,返回操作数所指的内存地址
    *: 间接寻址运算符,返回操作数内存地址的值
    *&:&返回操作数的内存地址,*&取操作数内存地址的值
    ? ? ? ? 因此,*&为操作数本身的值
    **&:**&的操作数只能为指针,&为指针自己的地址,*&为指针所指向的地址
    ? ? ? ? 因此,**&为指针所指向的地址的值

    main.cpp

    #include <QCoreApplication>
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        int b = 123;
        int *p = &b;
        qDebug()<<"b:"<<b;      // 123
        qDebug()<<"&b:"<<&b;    // 0x8ff938
        qDebug()<<"*&b:"<<*&b;  // 123
        qDebug()<<"p:"<<p;      // 0x8ff938
        qDebug()<<"*p:"<<*p;    // 123
        qDebug()<<"&p:"<<&p;    // 0x8ff944
        qDebug()<<"*&p:"<<*&p;  // 0x8ff938
        qDebug()<<"**&p:"<<**&p;// 123
        return a.exec();
    }

    运行结果

    结果分析

    b: ? ? 123?? ??? ?b的值为 123
    &b: ? 0x8ff938?? ?b的指向的地址为 0x8ff938
    *&b: 123?? ??? ?b指向的地址的值为 123
    p: ? ? ?0x8ff938?? ?p的值为 0x8ff938
    *p: ? ?123?? ?p的值(地址)的值为 123
    &p: ? 0x8ff944?? ?p指向的地址为 0x8ff944
    *&p: ?0x8ff938?? ?p指向的地址的值为 0x8ff938
    **&p:123?? ?p指向的地址的值(地址)的值为 123

    补充说明

    使用*符合会开辟内存空间,开辟内存空间肯定会有执行的内存地址
    *符合还可用于一维数组和二维数组的内存空间申请,其语法如下:
    一维数组:int *A = new int[6];
    二维数组:int **B = new int *[6];
    for(int i=0;i<10;i++){? ? // B[10][6]
    ????B[i] = new int[6];
    }
    注意:C++动态二维数组每一行都要开辟内存才能赋值
    因为二维数组实际上是一个一维数组,只是一维数组的
    每个值存放了另一个数组指针:每行开辟的数组的首地址

    数组长度

    int length = _msize(A) / sizeof(*A);

    数组的长度 = 数组占用的内存大小 / ?数组数据类型的字节大小

    申请的数组:int *A = int[6];?
    数组的长度:int length = 6;
    数组数据类型的字节大小:sizeof(*A)=4
    数组的内存大小:_msize(A)=24

    cs