2024-11-25 04:28:52
c语言里,二维数组和二级指针完全是两回事
c语言里二维数组是由一维数组所组成的一维数组
int a[3][3];
//a的元素是int[3] ,这里int[3]是一种数据类型(有3个int元素的数组),也就是说a[0]的类型就是int[3],那么a[0]的地址&a[0]的类型自然就是int(*)[3]了
p的类型是int**,&a[0]的类型是int(*)[3]; 而不是int**;所以p=&a[0];自然就是不合法的了
*p=a[1]; //正确,a[1]的值是&a[1][0],类型是int* ,*p的类型是int* , ok
p=&(*p); // 正确,*p的类型是int* ,&(*p)的类型是int** ,ok
p=&(a[1]); //错误,&(a[1])的类型是int(*)[3]; p的类型是int**,不行
ps: 因为p是new出来的,所以在做p=.....这类操作前一定要释放内存或者用另一个指针保留现场,不然会有内存泄漏
对一个一维数组名做取地址操作得到的值不是一个二级指针,而是一个指向一维数组的一级指针
int arr[3];
arr类型是int*,但&arr不是int**,而是int(*)[3];
你把一维数组看作是一种数据类型,就没这个问题了,c语言恰好提供了typedef这个东西:
typedef int ta[3]; //把由3个int组成的数组看成一种新类型ta;
那么int a[3][3]就可以写作
ta a[3]; //由3个ta类型组成的一维数组
那么&a[1]的类型就是ta*,指向ta类型的指针,ta是个什么玩意,ta是由3个int组成的数组,就是int[3],而不是int*
可以说弄清楚指针,c语言就入门了
2024-11-25 07:25:45
去掉括号也不对,报的错是
error C2440: '=' : cannot convert from 'int (*)[3]' to 'int ** '
是这样的 讨论了一下 你a(0) a(1) 这些都是常量 你不能取地址的
你可以写*p=a 但不能这样写
*p=a;是不对的,*p=a[1];可以
另外,为什么不能对a[0]取地址?