指针和二维数组
概述:不管是几维数组,当你使用数组名 a 而没有取地址操作符&时,它(a)都会退化为指向其第一层的指针。(一维数组指向首元素的指针,二维数组是第一行数组的指针,三维数组是指向其第一层(也就是第一个二维数组)的指针)
1、错误示范
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
int **p = a; //错误
a value of type "int (*)[4]" cannot be used to initialize an entity of type "int **"
原因:二维数组名(在没有被取地址操作符&作用时)会退化为指向其第一行第一个元素的一级指针,即 a 会被当作 int (*)[4] 类型的值,这是一个指向包含 4 个整数的数组的指针。
2、正确示范
int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
int (*p)[4] = a;
此时 p 为指向包含 4 个整数的(一维)数组的指针。
3、三维数组情况?
int a[2][3][4];
int(*p)[3][4] = a;
a 的类型是 int(*)[3][4],此时 p 指向的是一个三维数组,p[0]指向的是一个二维数组,p[0][0]指向的是一个一维数组。
总结:不管是几维数组,当你使用数组名 a 而没有取地址操作符&时,它(a)都会退化为指向其第一层的指针。(一维数组指向首元素的指针,二维数组是第一行数组的指针,三维数组是指向其第一层(也就是第一个二维数组)的指针)
补充:
int b = 1;
int *p1 = &b;
cout << sizeof(int) << endl; //4
cout << sizeof(p1) << endl; //8
在大多数现代计算机系统中,指针的大小通常是固定的,不论它指向的是什么类型的数据。在 32 位系统中,指针通常是 4 个字节,而在 64 位系统中,指针通常是 8 个字节。我的电脑是 64 位系统,所以 sizeof(p1)是 8。
标签:指向,int,第一层,C++,二维,引用,数组,指针 From: https://www.cnblogs.com/sherioc/p/18319683