我如何做这样的事情some_function({1,1,1,1})?

时间:2012-01-13 17:54:56

标签: c++ arrays

假设我有一个像这样的原型函数:int func(int * a),它接受​​一个数组作为参数。

如果没有编译器在任何地方显示错误,我该怎么做:func({1,1,1,1})

5 个答案:

答案 0 :(得分:6)

像这样:

int func(int * a);

void somewhere_else()
{
    int arr[4] = { 1, 1, 1, 1 };
    func(arr);
}

答案 1 :(得分:3)

不要使用原始数组,当然也不要将指针传递给函数。 EW!我们不再是1975年了。

#include <cstddef>
#include <iostream>
#include <vector>

void func(std::vector<int> const& v) {
   for (std::size_t i = 0; i < v.size(); i++)
      std::cout << v[i] << " ";
}

int main() {
   func({ 1, 2, 3, 4 });
}

// Output: "1 2 3 4 "

这需要一个符合C ++ 11某些功能的编译器。即初始化列表。

答案 2 :(得分:2)

您可以使用std::initializer_list

int func(std::initializer_list<int> a) {
  // do something with a here
}

或者您可以编写一个使用std::initializer_list的包装器(如果由于某种原因您无法更改原始函数):

int func_wrapper(std::initializer_list<int> a) {
  std::vector<int> b = a;
  func(b.data());
}

答案 3 :(得分:1)

这样做的一种方法是

 #include <iostream>
 #include <stdio.h>


  void abc (int *a,int z)
  {
   int m= z/sizeof(*a);    
   for(int i=0;i<m;i++)
      {
        std::cout<<"values " <<*a<<"\n";
        a++;
      }     
  }
 int main()
 {
   int ar[]={11,12,13,14,15,1166,17};
   std::cout << sizeof(ar)<<"size\n";
   abc(ar,sizeof(ar));   
   getchar();
 }

在这种情况下,您不必担心尺寸和所有问题。的情况下 int ar [3] = {1,2,3}如果您尝试搜索NULL,则会给出垃圾值 第三位被元素3占据

答案 4 :(得分:-1)

您只需要(int[])演员:

#include <iostream>

static void f (int* a) {
  while (*a) std::cout << *a++ << "\n" ;
  }

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

此代码输出

1
2
3
4

它也适用于C - 请参阅this ideone link

已更新以添加:我发布了a new question关于此构造的合法性,如果您对此类内容感兴趣,则Mat's answer值得一读。简而言之,它似乎仅在C99中有效,但有些编译器允许它作为所有C / C ++变体的扩展。