详解C++ 指针与二维数组名

 更新时间:2022年09月13日 08:45:08   作者:木三百川  
和一维数组类似,C++ 将二维数组名解释为其第一个元素的地址,而二维数组的第一个元素为一维数组,下面详细总结下二维数组名的性质,需要的朋友可以参考下

和一维数组类似,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)=50 而 sizeof(&array2d[0])=4
  • 表示 &array2d 的类型为 short (*)[5][5],存储的是一个 50 字节内存块的地址,它指向的对象是 5 行 5 列的二维 short 数组。
  • 表示 &array2d[0][0] 和 array2d[0] 等效,类型都为 short *,存储的是一个 2 字节内存块的地址,它指向的对象是 short 类型数据,但在运用 sizeof() 时,这两者会有区别,sizeof(&array2d[0][0])=4 而 sizeof(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

版权声明:本文系博主原创文章,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请附上出处链接。遵循 署名-非商业性使用-相同方式共享 4.0 国际版 (CC BY-NC-SA 4.0) 版权协议。

补充介绍:C++二维数组名与数组指针的思考

二维数组名和数组指针可以当做一个东西用,但两者之间的含义是不同的。
二维数组名是一个指向数组中所有元素的指针,而数组指针是一个行指针。体现在sizeof()上的不同。

#include <iostream>
using namespace std;
int main()
{
    // a是一个二维数组名,指向一个二维数组
    int a[2][3] = {{1,2,3},{4,5,6}};
    // a所占的内存为24,即6*4
    cout<<sizeof(a)<<endl;
    // 输出为4
    // a:&a[0]   a+1:&a[1]  *(a+1) : a[1] = &a[1][0]
    // **(a+1) = a[1][0]
    cout<<**(a+1)<<endl;
    // 输出为3
    // a:&a[0]  *a:a[0]:&a[0][0]  *a+2:&a[0][2]
    // *(*a+2):a[0][2]
    cout<<*(*a+2)<<endl;

    // 数组指针
    int (*b)[3] = a;
    // 数组指针可以当做二维数组名用
    cout<<**(b+1)<<endl;
    cout<<*(*b+2)<<endl;

    cout<<sizeof(b)<<endl;
}

到此这篇关于C++ 指针与二维数组名的文章就介绍到这了,更多相关C++ 指针与二维数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt+Opencv实现梯度矫正功能

    Qt+Opencv实现梯度矫正功能

    这篇文章主要为大家详细介绍了Qt如何结合Opencv实现梯度矫正功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • C++ 类的构造函数详解及实例

    C++ 类的构造函数详解及实例

    这篇文章主要介绍了C++ 类的构造函数详解及实例的相关资料,学习C++ 的朋友对构造函数肯定不陌生,非常重要的基础知识,这里就详细介绍下,需要的朋友可以参考下
    2016-12-12
  • 浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    浅谈int8_t int64_t size_t ssize_t的相关问题(详解)

    下面小编就为大家带来一篇浅谈int8_t int64_t size_t ssize_t的相关问题(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • C语言实现获取文件MD5值

    C语言实现获取文件MD5值

    MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法,这篇文章主要介绍了C语言如何获取文件MD5值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • C语言中循环嵌套的应用方式

    C语言中循环嵌套的应用方式

    这篇文章主要介绍了C语言中循环嵌套的应用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 使用C语言编写基于TCP协议的Socket通讯程序实例分享

    使用C语言编写基于TCP协议的Socket通讯程序实例分享

    这篇文章主要介绍了使用C语言编写基于TCP协议的Socket通讯程序实例分享,能够实现包括重新连接与每分钟通信一次等的功能,需要的朋友可以参考下
    2016-03-03
  • 利用Matlab制作一款狗头翻牌子小游戏

    利用Matlab制作一款狗头翻牌子小游戏

    本文将用Matlab制作一个狗头翻牌子的小游戏,就是点击一个牌子时,该牌子和周围四个牌子也会相应发生变化,想办法让所有牌子都在同一面即为游戏胜利。感兴趣的可以跟随小编学习一下
    2022-03-03
  • Mygui中文换行问题解决方案

    Mygui中文换行问题解决方案

    相信大家解决了中文输入后一定会遇到如何解决中文输入的问题,中文输入换行问题是很多gui框架都存在的一个问题,需要的朋友可以了解下
    2012-11-11
  • C++中的std::format 如何实现编译期格式检查

    C++中的std::format 如何实现编译期格式检查

    C++ 20 的 std::format 是一个很神奇、很实用的工具,最神奇的地方在于它能在编译期检查字符串的格式是否正确,而且不需要什么特殊的使用方法,只需要像使用普通函数那样传参即可,这篇文章主要介绍了std::format 如何实现编译期格式检查,需要的朋友可以参考下
    2024-04-04
  • C语言学习之标识符的使用详解

    C语言学习之标识符的使用详解

    C语言标识符是用于表示变量、函数、常量、类型等程序元素的名称,这篇文章将通过一些简单的示例为大家介绍一下C语言标识符的使用,需要的可以参考一下
    2023-05-05

最新评论