• C++ 指针与二维数组名


    和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,以下面的程序为例,二维数组名 array2d&array2d[0] 等效,它们的类型都为 short (*)[5];对数组名应用地址运算符时,得到的是整个数组的地址,它的类型为 short (*)[5][5],假设 short 宽 2 字节,系统为 32 位,数组首地址为0x00BCF8FC,例子中几种表示的区别为:

    • 数组名 array2d&array2d[0] 等效,类型都为 short (*)[5],存储的是一个 10 字节内存块的地址,它们指向的对象是包含 5 个元素的 short 数组,但在运用 sizeof() 时,这两者会有区别,sizeof(array2d)=50sizeof(&array2d[0])=4
    • 表示 &array2d 的类型为 short (*)[5][5],存储的是一个 50 字节内存块的地址,它指向的对象是 5 行 5 列的二维 short 数组。
    • 表示 &array2d[0][0]array2d[0] 等效,类型都为 short *,存储的是一个 2 字节内存块的地址,它指向的对象是 short 类型数据,但在运用 sizeof() 时,这两者会有区别,sizeof(&array2d[0][0])=4sizeof(array2d[0])=10
    • 类型 short **,存储的是一个 4 字节内存块的地址,它指向的对象是 short* 类型数据。
    //声明并初始化数组
    short array2d[5][5] = {{5,2,8,4,1},
    {2,2,4,6,8},
    {1,5,8,9,4},
    {5,7,6,2,5},
    {7,6,5,8,1}};
    //声明并初始化指针一:以下几种赋值结果对ptra等效
    short (*ptra)[5] = array2d; //方式一:值为0x00BCF8FC
    short (*ptra)[5] = &array2d[0]; //方式二:值为0x00BCF8FC
    //声明并初始化指针二
    short (*ptrb)[5][5] = &array2d; //值为0x00BCF8FC
    //声明并初始化指针三:以下几种赋值结果对ptrc等效
    short *ptrc = &array2d[0][0]; //方式一:值为0x00BCF8FC
    short *ptrc = array2d[0]; //方式二:值为0x00BCF8FC
    //声明并初始化指针四:以下几种赋值结果对ptrd等效
    short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};
    short** ptrd = ptrTmp; //方式一:值为0x00BCF8A4
    short** ptrd = new short*[5]{
    array2d[0],
    array2d[1],
    array2d[2],
    array2d[3],
    array2d[4]}; //方式二:值为0x01156470,需配合使用delete[]释放内存
    short** ptrd = new short*[5]();
    ptrd[0] = array2d[0];
    ptrd[1] = array2d[1];
    ptrd[2] = array2d[2];
    ptrd[3] = array2d[3];
    ptrd[4] = array2d[4]; //方式三:值为0x01046AE0,需配合使用delete[]释放内存
    //访问数组第3行第4列的元素
    cout << array2d[2][3]; //结果为9
    cout << *(array2d[2]+3); //结果为9
    cout << *(*(array2d+2)+3);//结果为9
    cout << ptra[2][3]; //结果为9
    cout << *(ptra[2]+3); //结果为9
    cout << *(*(ptra+2)+3); //结果为9
    cout << (*ptrb)[2][3]; //结果为9
    cout << *((*ptrb)[2]+3);//结果为9
    cout << *(*(*ptrb+2)+3);//结果为9
    cout << ptrc[2*5+3]; //结果为9
    cout << *(ptrc+2*5+3); //结果为9
    cout << ptrd[2][3]; //结果为9
    cout << *(ptrd[2]+3); //结果为9
    cout << *(*(ptrd+2)+3); //结果为9
    //应用指针算术时单位1表示的字节数
    cout << int(array2d+1)-int(array2d); //结果为10
    cout << int(&array2d[0]+1)-int(&array2d[0]); //结果为10
    cout << int(&array2d+1)-int(&array2d); //结果为50
    cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//结果为2
    cout << int(array2d[0]+1)-int(array2d[0]); //结果为2
    cout << int(ptra+1)-int(ptra); //结果为10
    cout << int(ptrb+1)-int(ptrb); //结果为50
    cout << int(ptrc+1)-int(ptrc); //结果为2
    cout << int(ptrd+1)-int(ptrd); //结果为4
    //应用sizeof()获得内存量大小
    cout << sizeof(array2d); //结果为50
    cout << sizeof(&array2d[0]); //结果为4
    cout << sizeof(&array2d); //结果为4
    cout << sizeof(&array2d[0][0]);//结果为4
    cout << sizeof(array2d[0]); //结果为10
    cout << sizeof(array2d[0][0]); //结果为2
    cout << sizeof(ptra); //结果为4
    cout << sizeof(ptrb); //结果为4
    cout << sizeof(ptrc); //结果为4
    cout << sizeof(ptrd); //结果为4
  • 相关阅读:
    iOS开发-4位或者6位验证码按顺序输入实现
    如何选择适合您需求的SOCKS5代理
    LabVIEW使用源代码控制
    springboot+vue+Elementui家族宗族信息门户网
    浮点数表示法(总结自CS61C和CMU CSAPP)
    浅谈 docker run 命令中的 -i -t 和 -d 选项
    BigDecimal工具类
    UI设计 ,我只推荐这6个网站,真的太好用了。
    【计算机网络】 7、websocket 概念、sdk、实现
    C专家编程 第1章 C:穿越时空的迷雾 1.2 C语言的早期体验
  • 原文地址:https://www.cnblogs.com/young520/p/16687946.html