我有一个原型函数
void test( int array [] , int b);
我知道我们可以将原型重新命名为:void test(int*, int);
在main()
中,我们声明了以下数组:
int array1[10], array2[10];
将函数体设置为0,
test ( array1 , b)
{
for ( int i = 0 ; i < b ; i++)
array1[i] = 0;
}
我可以做以下事吗?为什么?
int main()
{// assuming b is the size of the array
test(array1 , b);
test(array2 , b) ;
return 0;
}
我知道c ++的基本知识我试图编写自己的包含文件。 我只是想知道这是否可能,这是一个很好的选择?
答案 0 :(得分:3)
不能直接回答你的问题,但是你谈论C ++并使用普通的旧C阵列引起了我的注意:
首先考虑不使用C数组。相反,请使用std::vector<int>
。这可能避免了首先提出这个问题的需要(它避免了很多其他问题)。您无需担心正确的尺寸类型(int
?size_t
?还有其他?),因为std::vector
已经为您提供了正确的类型:std::vector<int>::size_type
。
您的功能签名只是
void test( std::vector<int> &a );
用零填充向量的实现将是:
void test( std::vector<int> &a )
{
std::fill( a.begin(), a.end(), 0 );
}
答案 1 :(得分:1)
是的,这是可能的;但是函数体中的声明应该与声明为原型的声明相同:
void test (int array1[], int b) // <---- see here (prefer `unsigned int` for size)
{
for ( int i = 0 ; i < b ; i++)
array1[i] = 0;
}
如果要将某些内容设置为0
,最好使用库函数memset()。
(作为建议,你可以在现有的基础上建立一个库。否则就像重新发明轮子一样。)
答案 2 :(得分:1)
您可能会询问形式参数与实际参数之间的区别。
在您的原型中
void test(int *array, size_t size);
名称'array'和'size'是形式参数。您可以在函数体内使用这些名称。
在调用函数的代码中,您可以使用不同的名称,这些名称是实际参数。
所以
int main()
{
const size_t b = 10;
int array1[10], array2[10];
test(array1 , b);
test(array2 , b) ;
return 0;
}
此处array1
和b
是第一次调用的实际参数,array2
和b
是第二次调用的实际参数。
所以是的,你可以使用你喜欢的任何名字作为实际参数,只要变量的类型与你的原型匹配。
答案 3 :(得分:0)
看起来你正在从C迁移。是的,这是可能的,但你需要正确的声明,否则编译器会抛出错误。
首选的C ++原型是
void test(int *array, size_t size);
在C ++中,您必须声明返回类型以及原型和实现中每个参数的类型。
注意:
您不需要使用size_t
,但它是首选(即使在C上)。 size_t
中包含stddef.h
(扩展名为cstddef
,这是首选的C ++包含)。它取决于体系结构,在32位系统中通常是unsigned int,在64位系统上是unsigned long long