[错误]在C ++中获取临时数组的地址?

时间:2017-10-11 13:22:43

标签: c++

我在java中有一个函数

static int a2(int[] a)
{
int sumEven = 0;
int sumOdd = 0;

for (int i=0; i<a.length; i++)
{
  if (a[i]%2 == 0)
    sumEven += a[i];
  else
    sumOdd += a[i];
}

return sumOdd - sumEven;
}

我在java中用main调用它,如

public static void main()
{
a2(new int[] {1});
a2(new int[] {1, 2});
a2(new int[] {1, 2, 3});
a2(new int[] {1, 2, 3, 4});
a2(new int[] {3, 3, 4, 4});
a2(new int[] {3, 2, 3, 4});
a2(new int[] {4, 1, 2, 3});
a2(new int[] {1, 1});
a2(new int[] {});
}

其中a2是函数,参数是数组。 我想用c ++实现同样的东西但是我不能像在java中传递的那样将数组传递给函数。以临时数组的地址给出错误[错误]。

在c ++中,我就是这样做的

f((int[4]) {1,2,3,4});

给出错误=&gt; [错误]获取临时数组的地址。

如何实现这一目标?

4 个答案:

答案 0 :(得分:5)

使用std::vector而不是处理低级数组:

int a2( const std::vector<int> &v )
{
    return std::accumulate( v.begin(), v.end(), 0, []( int a, int b ) {
        return a + ( b % 2 ? b : -b );
    } );
}

int main()
{
    a2( { 1, 2, 3 } );
}

live example

答案 1 :(得分:2)

在C / C ++中,普通函数没有数组参数。虽然你可以写像

这样的东西
void f(int a[]) { }

但是a会衰减到指针而不是数组。

但是如果你可以通过使用模板来解决这个问题

template <typename T, std::size_t N>
void f(const T (&a) [N]) {}

或正如其他人所说,std::vector可能是更好的选择,甚至是std::array

例如,要使用临时数组,您可以执行此操作,

typedef int INTARRAY [];
f (INTARRAY{1, 2, 3, 4});

请注意,现在f的声明已更改为使用const T而不是T

答案 2 :(得分:1)

对数组的引用在C ++中的工作方式略有不同。函数签名需要更改为类似 *注意您可以添加const以绑定到临时工具

int a2(int(&a)[3]){/*..*/}

对于大小为3的数组。也就是说,必须在编译时知道大小。

如果您想要使用不同大小的数组,请更改函数以接受指针和大小如此(在很多C风格的程序中使用):< / p>

int a2(int* a, int array_size){/*..*/}

或创建类似CS Pei提及的模板(可能是最好的方式,直接回答关于数组引用的问题)

template <class T, int N>
int a2(T (&a) [N]) {/*..*/}

答案 3 :(得分:1)

你在这里

#include <iostream>

template <size_t N>
int f( const int ( &a )[N] )
{
    int sumEven = 0;
    int sumOdd = 0;

    for ( size_t i = 0; i < N; i++ )
    {
        if ( a[i] % 2 == 0 )
            sumEven += a[i];
        else
            sumOdd += a[i];
    }

    return sumOdd - sumEven;
}

int main() 
{
    std::cout << f( {1} ) << std::endl;
    std::cout << f( {1, 2} ) << std::endl;
    std::cout << f( {1, 2, 3} ) << std::endl;
    std::cout << f( {1, 2, 3, 4} ) << std::endl;
    std::cout << f( {3, 3, 4, 4} ) << std::endl;
    std::cout << f( {4, 1, 2, 3} ) << std::endl;

    return 0;
}

程序输出

1
-1
2
-2
-2
-2

至于你使用表达式作为参数,例如这里

f((int[4]) {1,2,3,4});

然后

( int[4] ){ 1, 2, 3, 4 }

是在C中定义的复合文字,但未在C ++中定义。如果要编写一个使用复合文字的C程序,那么该函数必须有第二个参数来指定数组中的元素数。

例如

#include <stdio.h>

int f( int a[], size_t n )
{
    int sumEven = 0;
    int sumOdd = 0;

    for ( size_t i = 0; i < n; i++ )
    {
        if ( a[i] % 2 == 0 )
            sumEven += a[i];
        else
            sumOdd += a[i];
    }

    return sumOdd - sumEven;
}

int main( void ) 
{
    printf( "%d\n", f( ( int[] ){1}, 1 ) );
    printf( "%d\n", f( ( int[] ){1, 2}, 2 ) );

    return 0;
}