【问题标题】:Is an int* parameter exactly the same as a int[] parameterint* 参数是否与 int[] 参数完全相同
【发布时间】:2012-09-24 04:14:05
【问题描述】:

以下2个功能本质上是一样的吗?

即,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);

【问题讨论】:

标签: c++ c function pointers parameters


【解决方案1】:

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

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);
    

    是等价的。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-10
          • 2015-03-08
          • 2020-05-25
          • 2011-06-02
          • 2021-03-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多