char[]和&char[]有什么区别?

4

我正在尝试更好地理解&运算符(取地址符)在API中的使用。

这是我的示例API函数签名:

apiFunction(const int*)

我正在处理别人的代码,他们使用API如下:

int inputs[1] = {1};
apiFunction((const int*)&inputs);

我认为正确的用法应该是:

int inputs[1] = {1};
apiFunction(inputs);

当“inputs”是一个长度为1的char数组时,“inputs”和“&inputs”之间有什么区别吗?

当我使用printf时,它们看起来相同,但我担心我可能格式化不正确:

printf("%p, %p", inputs, (const int*)&inputs);

输出结果(例如):

0204DE94 0204DE94

1
为什么需要转换&inputs?那应该是您自动寻找的类型。调用方还要负责正确编码参数,因此在需要地址时调用&不应该让人感到惊讶。 - tadman
https://dev59.com/m3M_5IYBdhLWcg3wPAnU - stark
@PeterJ 长度为1的数组的目的并不明显,因为我简化了我正在处理的实际代码。API实际上接受数组长度,然后是输入数组的指针。API可以处理多个输入,但对于我的应用程序,我只需要一个输入。 - Caprooja
@tadman同意。惊喜在于&inputs是“数组的地址”,而不是“数组地址的地址”。 - Caprooja
@tadman 因为没有 & 运算符的输入是 int*(指针是一个地址),显然我是错的,但是我试图解释我的思维过程。 - Caprooja
显示剩余4条评论
1个回答

3
表达式&input的类型是int (*)[1],即大小为1的数组指针。这与input形成对比,后者(在大多数情况下)会衰减为指向第一个元素的指针,并具有类型int *
虽然数组和第一个元素的地址相同,但当应用指针算术时,每个类型的差异就会发挥作用。
在期望const int *apiFunction上下文中,您可以通过传递&input(带有强制转换)或input来达到相同的效果。然而,后者是正确的做法。
apiFunction(inputs);

所以你是正确的,你找到的代码没有正确地传递参数。



代码没有正确传递参数,但从功能上来说是正常的,因为它们具有相同的值。这是我从你的回答中得到的信息。 - Caprooja
通常情况下,当指针的功能是正确的,因为它们具有相同的值时,从技术上讲,这是未定义行为,但编译器会执行显而易见的操作,并且在实践中可以正常工作。在这种情况下,我认为它实际上是明确定义的,因为它做了相同的事情。 - Daniel H
@Caprooja,没错,这是因为“input”和“&input”具有相同的值。 - dbush
@DanielH 弱点在于 (const int*)&inputs 的转换。从 int** 转换为 const int*。如果我没记错,像 int 这样的简单类型的指针可能具有不同的大小和表示方式(如果经过适当的转换,则相互等同),而与指向指针的指针不同,这种转换是有问题的,除非它通过 void * 进行。另一方面,速度限制为55 - chux - Reinstate Monica
没有指向指针的指针;衰减不会发生在那里。&inputs 的类型是 int[1]*,或者说是指向一个 int 数组的指针。我认为你可以在指向数组和指向其元素类型之间进行转换,至少如果它的元素是标准布局,可能无论如何都可以。 - Daniel H
哎呀,我把类型写错了;它真正的类型是 int (*)[1] - Daniel H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接