以下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);
答案 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[]);
的头文件库仍然可以改变实现并发送一个新的库对象,支持处理不同大小的数组(它需要根据其他一些参数或哨兵传输进行检测),而不需要更改标题或触发客户端重新编译(在大多数构建系统中)