

C++ 指针与二维数组名 - 木三百川
source link: https://www.cnblogs.com/young520/p/16687946.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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; //方式一:值为0x00BCF8FCshort (*ptra)[5] = &array2d[0]; //方式二:值为0x00BCF8FC //声明并初始化指针二short (*ptrb)[5][5] = &array2d; //值为0x00BCF8FC //声明并初始化指针三:以下几种赋值结果对ptrc等效short *ptrc = &array2d[0][0]; //方式一:值为0x00BCF8FCshort *ptrc = array2d[0]; //方式二:值为0x00BCF8FC //声明并初始化指针四:以下几种赋值结果对ptrd等效short *ptrTmp[5] = {array2d[0],array2d[1],array2d[2],array2d[3],array2d[4]};short** ptrd = ptrTmp; //方式一:值为0x00BCF8A4short** 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]; //结果为9cout << *(array2d[2]+3); //结果为9cout << *(*(array2d+2)+3);//结果为9 cout << ptra[2][3]; //结果为9cout << *(ptra[2]+3); //结果为9cout << *(*(ptra+2)+3); //结果为9 cout << (*ptrb)[2][3]; //结果为9cout << *((*ptrb)[2]+3);//结果为9cout << *(*(*ptrb+2)+3);//结果为9 cout << ptrc[2*5+3]; //结果为9cout << *(ptrc+2*5+3); //结果为9 cout << ptrd[2][3]; //结果为9cout << *(ptrd[2]+3); //结果为9cout << *(*(ptrd+2)+3); //结果为9 //应用指针算术时单位1表示的字节数cout << int(array2d+1)-int(array2d); //结果为10cout << int(&array2d[0]+1)-int(&array2d[0]); //结果为10cout << int(&array2d+1)-int(&array2d); //结果为50cout << int(&array2d[0][0]+1)-int(&array2d[0][0]);//结果为2cout << int(array2d[0]+1)-int(array2d[0]); //结果为2 cout << int(ptra+1)-int(ptra); //结果为10cout << int(ptrb+1)-int(ptrb); //结果为50cout << int(ptrc+1)-int(ptrc); //结果为2cout << int(ptrd+1)-int(ptrd); //结果为4 //应用sizeof()获得内存量大小cout << sizeof(array2d); //结果为50cout << sizeof(&array2d[0]); //结果为4cout << sizeof(&array2d); //结果为4cout << sizeof(&array2d[0][0]);//结果为4cout << sizeof(array2d[0]); //结果为10cout << sizeof(array2d[0][0]); //结果为2 cout << sizeof(ptra); //结果为4cout << sizeof(ptrb); //结果为4cout << sizeof(ptrc); //结果为4cout << sizeof(ptrd); //结果为4
Recommend
-
9
C语言的数组指针能带来什么好处?为什么要使用它? 发表于 2019-09-16 19:09...
-
22
c语言入门22,三分钟分清数组指针和指针数组,绕口令名字谁取的 发表于 2018...
-
3
数组和指针的异同 2021年1月3日 / 3次阅读CC++ 编写C语言代码,数组和指针可能是最trick的地方,它们本质上相同,但用法细节上有一点点不同。 char *k; 定义一个指针。还可以初始...
-
9
golang的数组和指针的问题,求解答 txgu · 45分钟之前 · 39 次点击 · 预计阅读时间不到 1 分钟 ·...
-
6
Go 1.17新特性详解:支持将切片转换为数组指针 八月 18, 2021 0 条评论
-
5
Summary1)数组是一段连续的内存空间,数组的元素个数为 #define DIM(a) (sizeof(a) / sizeof(*a)) 2)指针是一种特殊的变量,与整数的运算规则为: p + n; <--> (unsigned int)p...
-
4
数组和指针,内存之间的关系
-
7
C++ 二级指针与 const 关键字 可用七种不同的方...
-
5
C++ 左值引用与一级指针 将左值引用
-
4
1. 字符指针变量字符指针变量是存放地址的char ch = 'w'; char* pc = &ch; *pc = 'w';表达式的两个属性: 【值属性】计算后的值是多少 【类型属性...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK