5

以下2个功能本质上是相同的功能吗?

即,int*a 与 a 完全一样int[]吗?

int myFunction(int* xVals, int* yVals, int nVertices);
int myFunction(int xVals[], int yVals[], int nVertices);

如何使用第一个功能?即,如何在参数中传递数组?以下是有效/正确的吗?

int xVals[5], yVals[5], zVals[5];
myFunction(xVals, yVals, zVals, 5);

// or should it be..
myFunction(&xVals[0], &yVals[0], &zVals[0], 5);
4

4 回答 4

8

在函数参数列表中,函数声明是等价的:

int myFunction(int* xVals, int* yVals, int nVertices);
int myFunction(int xVals[], int yVals[], int nVertices);

然而,这并不容易一概而论。在函数内部,有很大的区别:

int AnotherFunction(void)
{
    int array[] = { 0, 1, 2, 3 };
    int *iptr = &array[0];
    ...
}

而在函数接口中,两种参数类型有很大区别:

int arrays_vs_pointers(int **iptrptr, int array[][12]);

您还询问(更正):

int xVals[5], yVals[5];
myFunction(xVals, yVals, 5);

// or should it be..
myFunction(&xVals[0], &yVals[0], 5);

这些调用都是有效的并且彼此等效。


你原来的标题问题的答案是'一个和一个int *完全一样int []吗?'是否

在非常有限的情况下它们是等价的,但是在更多的情况下它们是非常不同的。

您修改后的标题问题的答案'参数与参数完全相同吗?int *int []'的!

于 2012-09-24T04:21:19.413 回答
2

标题中的问题与实际帖子正文中的问题不同......

一般来说,指针和数组是一样的,所以在很多情况下,指针和数组int []是不一样的int *

但是,在函数声明(或定义)中,当一维数组作为参数传递时,它会衰减为指针,这就是为什么与第一种情况相反,

int myFunction(int *xVals, int *yVals, int nVertices);

int myFunction(int xVals[], int yVals[], int nVertices);

是等价的。

于 2012-09-24T04:20:00.773 回答
1

前面的答案是正确的。这只是为了补充您的声明和调用之间的参数计数不匹配:

int myFunction(int* xVals, int* yVals, int nVertices);

myFunction(xVals, yVals, zVals, 5);

myFunction 需要 3 个参数,但您在调用中传递了 4 个参数。

于 2012-09-24T04:23:31.080 回答
0

围绕此类参数规范的一些有趣(有用?)点:

  • 如果您为一维数组参数指定维度,则不会以任何方式检查调用者提供的参数,例如:f(int x[5])可以调用 alaint x[] = { 1, 2}; f(x);甚至int x; f(&x);

  • 如果您接受对参数的引用,则检查尺寸并且必须匹配,例如:f(int (&x)[5])只能使用具有正好 5 个元素的整数数组的参数调用(或转换为该类型的东西)

  • 模板可用于捕获编译器已知的参数维度,如下所示:template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • 对于最后两个引用参数,您不能传入任何旧的指向- int...如果指针确实指向合适的数组,则必须先对其进行类型转换

  • 在编译时检查引用参数表明当参数的数量在编译时已知时应该首选它们......实际上它可能比这更复杂,例如提供标头声明的库void f(int[]);仍然可以改变实现并发布一个新的库对象,支持处理不同大小的数组(它需要根据其他一些参数或哨兵约定来检测),而无需更改标题或触发客户端重新编译(在大多数构建系统中)

于 2012-09-24T04:53:51.677 回答