int *参数与int []参数完全相同

时间:2012-09-24 04:14:06

标签: c++ c function pointers parameters

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

int*int[]完全相同?

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

如何使用1st功能?即,我如何在参数中传递数组?以下是否有效/正确?

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 个答案:

答案 0 :(得分: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 []参数完全相同?'的答案是!< / p>

答案 1 :(得分:2)

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

一般不是指针与数组相同,因此在很多情况下,int []与{不一样{1}}。

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

int *

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

是等价的。

答案 2 :(得分:1)

之前的答案是正确的。这只是为了补充说明您的声明与通话之间的参数计数不匹配:

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

myFunction(xVals, yVals, zVals, 5);

myFunction期待3个参数,但你在通话中传递了4个。

答案 3 :(得分:0)

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

  • 如果为1维数组参数指定维度,则不会以任何方式检查调用者提供的参数,例如:f(int x[5])可以称为ala int 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... }

  • 对于最后两个by-reference参数,你不能传入任何旧的指针 - int ...如果指针真的是一个合适的数组,你必须首先对其进行类型转换

  • 在编译时检查by-reference参数表明在编译时知道参数的数量时应该优先考虑它们...实际上它可能比这更复杂,例如提供标头void f(int[]);的头文件库仍然可以改变实现并发送一个新的库对象,支持处理不同大小的数组(它需要根据其他一些参数或哨兵传输进行检测),而不需要更改标题或触发客户端重新编译(在大多数构建系统中)