int**p=new int*; int a[3][3]; *p=a[0];//正确 p=&(a[0]);//不正确 为什么&(a[0])不应该是地址的地址吗

兄弟姐妹们有没有人讲详细点的,我想问一下,int**p=new int*; int a[3][3]; *p=a[0];//正确 p=&(a[0]);//不正确 为什么&(a[0])不应该是地址的地址吗
最新回答
素婉纤尘

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

a[0]表示的是一个值 而a表示的是数组的首地址 也就是你所说的p

&(a[0])这个错误是在于括号 加个括号表示是一个值 哪里来的地址一说 如果你把括号去掉 这样就可以了
追问
去掉括号也不对,报的错是
error C2440: '=' : cannot convert from 'int (*)[3]' to 'int ** '
追答
是这样的 讨论了一下 你a(0) a(1)  这些都是常量  你不能取地址的
你可以写*p=a 但不能这样写
追问
*p=a;是不对的,*p=a[1];可以
另外,为什么不能对a[0]取地址?