10

C++ 指针与二维数组名 - 木三百川

 2 years ago
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.
neoserver,ios ssh client

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; //方式一:值为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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK