C 将b声明为int数组10的指针的目的是什么

C 将b声明为int数组10的指针的目的是什么,c,arrays,pointers,C,Arrays,Pointers,看,我看到了一些类似的代码 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

看,我看到了一些类似的代码

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 array 10 of pointer to int
int(*b)[10]

1> 将为int的10个元素分配内存,并且该内存的地址将分配给b

2> 将没有为阵列分配内存。这里它说b能够保存10个元素的地址和int数组

哪种选择是正确的?
如果有人是对的,那么为什么要使用这种复杂的语法而不是使用不同的方法呢?

int(*b)[10]
是指向int数组的指针,
intb[10]
是int数组。(下次可能会选择不同的名称。)也许你想
malloc
数组存储,
b=malloc(sizeof(*b))
。为此,您需要一个指向数组类型的指针。

实际上存在差异。在
intb[10]
中,
b
是一个指针常量(这意味着它可以用来修改其基础数据,但不能更改为指向其他内容)。另一方面,
int(*b)[10]
中的指针可以更改为指向其他对象(当然也可以更改其基础数据)。所以区别在于说
b
int(*b)[10]
;您在此警告下一个看到您的代码的开发人员,此
b
可以指向代码中的其他地方。这就是为什么——显然——除非你真的想改变
b
所指的内容,否则不要这样做(否则你只会混淆谁会追你)

关于你的问题,我使用
sizeof(b)
进行了检查

int(*b)[10]
==>
sizeof(b)
是4(这意味着没有分配内存-选项2)

intb[10]
==>
sizeof(b)
为40(这意味着内存按预期分配-选项1)

看看这个:

int (*b)[10];

int x[10];
b = &x;
这是一份汇编。将数组的大小更改为其他大小。它不会编译!这意味着您的非常正确:-D。选项2编写得非常完美:此指针只能指向大小为10的数组,而不能指向其他数组

[根据问题所有者的要求添加]


这种语法有什么好处?这只是一个已经存在的特性,可能对某些人有用。这就是我对它的理解(如果错了,请纠正我):例如,你可以说:
string(*足球队球员的姓名)[11]
的优点是——显然——将数组限制为正好11个名称来处理应用程序逻辑——团队实际上必须正好有11个名称。这为那些阅读您的代码的人提供了更多的可读性,并强调了它的正确性…

C允许使用数组的名称,而不使用下标作为表示数组基地址的右值。它还允许在通常访问数组时使用偏移量隐式取消引用指针。因此,当且仅当b不需要指向同一数组的不同数组或不同元素时,这些声明在逻辑上和语法上是等价的。从技术上讲,它们是不同的,因为
intb[10]
需要
sizeof(int)*10
字节来保存数组,而
int(*b)[10]
需要额外的
sizeof(int*)
字节来保存指向所述数组的指针。如果数组是在函数外部声明的,那么访问
int b[10]
的元素可能会使用更小的操作码和更少的寄存器


我建议您在计划使用它时声明它。如果您不知道为什么它可能是指针,请将其声明为数组。如果需要在堆上动态分配、重置或声明为函数参数,则它应该是指针。

可能重复@特洛伊木马。嘿,这不是重复的。我知道所有方法之间的区别。我想知道使用第一个方法比第二个方法的目的。数组和指针不是一回事。阅读@pmg-ya的第6节,我知道这两个都是不同的东西,所以我明白了,伙计……现在为什么有人写int(*b)[10],而不只是使用任何指向任何数组的通用指针?说“指向int的数组10的指针”有什么好处/意义?顺便问一下,+1是一个很好的问题:这是我第一次看到这个语法。。。非常感谢-我学到了一些新的东西。我想第一次在stackoverflow中,任何回答者都会对提问者表示感谢……he-he-1数组不是恒定的指针。数组就是数组,它们可以分解成指针。