C++ 如何使数组成为C+;中函数的参数+;?
我在为学校科学展编写的程序中有一个函数,它需要做的是将数组作为参数,加密数组的值,并将加密的值存储在字符串中。我该怎么做C++ 如何使数组成为C+;中函数的参数+;?,c++,encryption,hash,C++,Encryption,Hash,我在为学校科学展编写的程序中有一个函数,它需要做的是将数组作为参数,加密数组的值,并将加密的值存储在字符串中。我该怎么做 void YourFunction(const int myarray[]); 否则,如果要接受任何类型的 void YourFunction(const void* myGenericArray); 希望这有帮助 void encrypt(Array& array, /*other parameters*/) 否则,如果要接受任何类型的 void YourFu
void YourFunction(const int myarray[]);
否则,如果要接受任何类型的
void YourFunction(const void* myGenericArray);
希望这有帮助
void encrypt(Array& array, /*other parameters*/)
否则,如果要接受任何类型的
void YourFunction(const void* myGenericArray);
希望这有帮助
void encrypt(Array& array, /*other parameters*/)
可以,不管使用什么数组类型
如果数组是C型指针,也可以传递它:
void encrypt(int* array, /*other parameters*/)
可以,不管使用什么数组类型
如果数组是C型指针,也可以传递它:
void encrypt(int* array, /*other parameters*/)
有几种方法可以做到这一点。以下是几个例子:
- C型
在这种样式中,数组衰减到指向第一个参数的指针,该参数作为第一个参数传递给函数。由于此转换会丢失数组的大小,因此还必须传递该大小,我将其作为第二个参数传递给函数。将其用作:void f(T *array, size_t size);
T array[N]; //N is some compile-time constant. f(array, N);
T array[N]; f(array); //calls the first version (the template version) std::vector<T> v; //fill v f(v); //calls the vector version
- C++风格
很酷,不是吗template<typename T, size_t size> void f(T (&array)[size]); void f(std::vector<T> & array);
- C型
在这种样式中,数组衰减到指向第一个参数的指针,该参数作为第一个参数传递给函数。由于此转换会丢失数组的大小,因此还必须传递该大小,我将其作为第二个参数传递给函数。将其用作:void f(T *array, size_t size);
T array[N]; //N is some compile-time constant. f(array, N);
T array[N]; f(array); //calls the first version (the template version) std::vector<T> v; //fill v f(v); //calls the vector version
- C++风格
很酷,不是吗template<typename T, size_t size> void f(T (&array)[size]); void f(std::vector<T> & array);
有几种方法可以做到这一点。以下是几个例子:
向量
,数组
,仅仅是c样式的数组,或者其他什么?什么部分导致了您的问题?可以将数组的名称作为参数传递给以类型指针为参数的函数;例如,您可以将inta[10]
传递到foo(int*p)
。当然,foo()
不会知道a
的大小——您必须将其作为第二个参数传递。也许我不够清楚。正确的写入方式是什么:如何获取数组?在向量
,数组
,仅仅是c样式的数组,或者其他什么?什么部分导致了您的问题?可以将数组的名称作为参数传递给以类型指针为参数的函数;例如,您可以将inta[10]
传递到foo(int*p)
。当然,foo()
不会知道a
的大小——您必须将其作为第二个参数传递。也许我不够清楚。正确的写入方式是什么:这还不够——您不知道数组的大小。此外,问题是标记C++,所以泛型确实应该用模板来完成,而不是<代码> Value*/Cuff>。不能使用<代码> const > >:OP需要改变数组中的值。@弗拉德,这不是我的阅读需求。数组是一个输入参数。字符串是输出参数。@MikeSeymour:有一个不精确的问题,我很明显只能写这个。但是,如果你在C++中使用函数,在使用VoT *时没有问题,我是说,当你使用函数作为一个面向对象程序时,你仍然使用C++作为C程序,这是不够的,你不知道数组的大小。此外,问题是标记C++,所以泛型确实应该用模板来完成,而不是<代码> Value*/Cuff>。不能使用<代码> const > >:OP需要改变数组中的值。@弗拉德,这不是我的阅读需求。数组是一个输入参数。字符串是输出参数。@MikeSeymour:有一个不精确的问题,我很明显只能写这个。但是,如果你在C++中使用函数,在使用VoT *时没有问题,我是说,当你使用C++作为函数时,你仍然使用C++作为一个面向对象程序,而对于它来说,额外的通用性,f(&var1,&var2)
对于任何类型相同的变量var1
/var2
,哪种类型会破坏编译时安全性。@MikeSeymour:谢谢。将其添加到我的帖子中。@Vlad:这是所有类型的标准容器的问题,但关键是在使用该函数之前,您必须阅读文档。如果你不阅读文档,那么你就可以编写这样的代码,不管你如何编写函数。@Nawaz:好吧,编译时安全就是防止愚蠢的错误/打字错误。假设您将函数用作f(&a[0],&a[5])
(完全合法),我来将所有出现的a
更改为b
,除了一个错误。编译器无法捕捉到这一点。如果我们想让用户单独使用文档,而不需要有用的编译器支持,那么我们也可以使用最通用的void*
。(注意:我认为这是C++模板的问题:它们太强大,太接近宏)。对于额外的通用性,<代码>模板无效F(它开始,结束);@Mike:这样,代码就可以为调用编译,比如f(&var1,&var2)
对于任何类型相同的变量var1
/var2
,哪种类型会破坏编译时安全性。@MikeSeymour:谢谢。将其添加到我的帖子中。@Vlad:这是所有类型的标准容器的问题,但关键是在使用该函数之前,您必须阅读文档。如果你不阅读文档,那么你就可以编写这样的代码,不管你如何编写函数。@Nawaz:好吧,编译时安全就是防止愚蠢的错误/打字错误。假设您将函数用作f(&a[0],&a[5])
(完全合法),我来将所有出现的a
更改为b
,除了一个错误。编译器无法捕捉到这一点。如果我们想让用户单独使用文档,而不需要有用的编译器支持,我们可以使用