看,我看到了一些代码
int (*b)[10];这意味着
declare b as pointer to array 10 of int所以我想问你这样做的目的是什么?
为什么我们不写而不写
int array[10];并用作数组的传递地址。
两者是一样的还是有什么区别?
编辑:不要与混淆
int *b[10]; // this one declare b as array 10 of pointer to int和
int (*b)[10]; // this one declare b as pointer to array 10 of int再一次编辑
请参阅int (*b)[10];
1>will为int的10个元素分配内存,该内存的地址将分配给b?
或
2>there将不会为数组分配内存。这里说b能够容纳10元素的地址和int数组?
哪一种选择是正确的?如果有人是对的,那么为什么要使用这种复杂的语法而不是使用不同的方法呢?
发布于 2011-10-31 09:35:07
其实是有区别的。在int b[10]中,b是指针常量(这意味着它可以用于修改其底层数据,但不能更改为指向其他数据)。另一方面,可以将int (*b)[10]中的指针更改为指向其他东西(当然,还可以更改其底层数据)。因此,区别在于,通过说b是int (*b)[10],您在此警告下一个看到您的代码的开发人员,这个b可以指向代码中的其他地方。这就是为什么--很明显--不要这么做,除非你真的想改变b所指的东西(否则你只是混淆了谁会来找你)。
关于您的问题,我使用sizeof(b)进行了检查。
int (*b)[10] ==> sizeof(b)是4(这意味着没有内存分配-选项2)。
int b[10] ==> sizeof(b)为40 (这意味着按预期分配内存-选项1)。
看看这个:
int (*b)[10];
int x[10];
b = &x;这是汇编的。将数组的大小更改为任何其他内容。不会编译的!这意味着您是非常正确的 :-D。选项2写得很完美:这个指针只能指向大小为10的数组,而不能指向其他任何东西。
根据问题所有者的请求添加
这样的语法有什么好处?这只是一个已经存在的特性,也许它对某些人有用。这就是我理解它的方式(如果我错了,请纠正我):例如,您可以说:string (*names_of_players_in_soccer_team)[11];,其优点是--很明显--将数组限制为精确的11个名称来处理应用程序逻辑--团队实际上必须有11个名称。这为那些将阅读您的代码的人提供了更多的可读性,并强调了它的正确性。
发布于 2011-10-31 09:24:21
int (*b)[10]是int数组的指针,int b[10]是int数组的指针。(下一次可能会选择不同的名字?)也许您想要malloc数组存储,b = malloc(sizeof(*b))。为此,需要一个指向数组类型的指针。
发布于 2011-10-31 09:50:00
C允许使用数组的名称,而不使用下标作为rvalue,即数组基的地址。它还允许在通常访问数组时,使用偏移量隐式取消指针。因此,这些声明在逻辑上和语法上是等价的,当且仅当b永远不需要指向同一数组的不同数组或不同元素时。从技术上讲,它们是不同的,因为int b[10]需要sizeof(int)*10字节来保存数组,而int (*b)[10]需要额外的sizeof(int*)字节来保存指向所述数组的指针。如果数组是在函数之外声明的,则访问int b[10]的元素可以使用更小的操作码和更少的寄存器。
我建议您在计划使用它时声明它。如果不知道为什么它可能是指针,请将其声明为数组。如果需要在堆上动态分配、重新分配或声明为函数参数,则应该是一个指针。
https://stackoverflow.com/questions/7951729
复制相似问题