一个int*参数和一个int[]参数完全一样吗?

5

以下两个函数本质上是相同的吗?

也就是说,int*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
你确定你不是想要 int xVals[] 吗? - cnicutar
@cnicutar 是的,抱歉,应该是这样的。 - sazr
没问题,现在我可以给你提供 但我听说 char a [] 与 char * a 相同 的参考资料了。 - cnicutar
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 []参数完全一样吗?”的答案是“是”!

2
标题中的问题与实际帖子内容中的问题不同...
一般来说,指针和数组是不同的,所以在很多情况下,int [] 和 int* 是不同的。
但是,在函数声明(或定义)中,当一个一维数组被作为参数传递时,它会衰变成一个指针,这就是为什么与第一种情况相比,...
int myFunction(int *xVals, int *yVals, int nVertices);

并且

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

它们是等价的。

1
之前的回答是正确的。这只是要补充说明您在声明和调用之间具有不匹配的参数计数:
int myFunction(int* xVals, int* yVals, int nVertices);

myFunction(xVals, yVals, zVals, 5);

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


0

关于这样的参数规范,有一些有趣(有用?)的要点:

  • 如果您为一维数组参数指定了一个维度,则不会对其与调用方提供的参数进行任何检查,例如:f(int x[5])可以像这样被调用:int x[] = { 1, 2}; f(x);甚至是int x; f(&x);

  • 如果您接受一个参数的引用,则维度将被检查并且必须匹配,例如:f(int (&x)[5])只能使用一个恰好有5个元素的整数数组作为参数(或者转换为该类型)

  • 模板可用于捕获编译器已知的参数维度,例如:template <size_t N> void f(int (&x)[N]) { ...可以在此处使用N... }

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

  • 按引用传递的参数在编译时进行检查表明它们应该在编译时已知参数数量时优先考虑...实际上可能比那要复杂一点,例如提供声明void f(int[]);的头文件的库仍然可以变化实现并提供支持处理不同大小数组的新库对象(它需要基于其他参数或标志约定检测),而无需更改头文件,也不会触发客户端重新编译(在大多数构建系统中)


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