假设我有一个像这样的原型函数:int func(int * a)
,它接受一个数组作为参数。
如果没有编译器在任何地方显示错误,我该怎么做:func({1,1,1,1})
答案 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 ++变体的扩展。