将数组传递给函数C++; 我有一个关于C++中数组的传递的问题,我不理解。

将数组传递给函数C++; 我有一个关于C++中数组的传递的问题,我不理解。,c++,arrays,pointers,char,parameter-passing,C++,Arrays,Pointers,Char,Parameter Passing,基本上,当您想要将integer类型的数组传递给另一个函数时,您必须向该数组传递一个地址,而不是直接传递整个连续内存块。究竟是什么原因 也可以,为什么Car数组可以直接传递到C++中的另一个函数而不需要通过地址??? 我曾尝试在网上寻找这方面的学习材料(如cplusplus.com),但我还没有找到并解释 谢谢您的时间,丹。您不能按值传递任何数组。可以按值传递包含数组的结构或C++11中的std::array。不能按值传递任何数组。你可以通过值从包含C++的数组或 STD::SARDUCT/ 1

基本上,当您想要将integer类型的数组传递给另一个函数时,您必须向该数组传递一个地址,而不是直接传递整个连续内存块。究竟是什么原因

也可以,为什么Car数组可以直接传递到C++中的另一个函数而不需要通过地址??? 我曾尝试在网上寻找这方面的学习材料(如cplusplus.com),但我还没有找到并解释


谢谢您的时间,丹。

您不能按值传递任何数组。可以按值传递包含数组的结构或C++11中的
std::array

不能按值传递任何数组。你可以通过值从包含C++的数组或<代码> STD::SARDUCT/<代码> 11。

< P>只要C++,通过“代码> char数组< /C> >和<代码> int数组< /C> >相同。

< C++中有2种方法可以通过数组。

地址已传递

int fn(int *arrays, int len);
int fn(int arrays[], int len); // Similar to above, still staying as sytax hangover from anci c
int fn(int (&array)[SIZE]); // Actual array passed as reference
已传递数组引用

int fn(int *arrays, int len);
int fn(int arrays[], int len); // Similar to above, still staying as sytax hangover from anci c
int fn(int (&array)[SIZE]); // Actual array passed as reference
您可以将上述函数模板化为

template<size_t SIZE>
int fn(int (&array)[SIZE]);
模板
int fn(int(&数组)[大小];
上述方法允许您将任意大小的数组传递给此函数。但请注意,每个大小的模板都会创建不同的函数。如果函数的副作用改变了局部状态(ex的静态变量),则应谨慎使用

如果不想更改内容,请使用带参数的
const


<如果在函数参数中需要数组的复制,考虑使用STL容器,如“代码> STD::数组或STD::vector < /C>或嵌入在您的类中。

< P>只要C++,通过<代码> char数组< /C>和int数组< /C> >相同。

< C++中有2种方法可以通过数组。

地址已传递

int fn(int *arrays, int len);
int fn(int arrays[], int len); // Similar to above, still staying as sytax hangover from anci c
int fn(int (&array)[SIZE]); // Actual array passed as reference
已传递数组引用

int fn(int *arrays, int len);
int fn(int arrays[], int len); // Similar to above, still staying as sytax hangover from anci c
int fn(int (&array)[SIZE]); // Actual array passed as reference
您可以将上述函数模板化为

template<size_t SIZE>
int fn(int (&array)[SIZE]);
模板
int fn(int(&数组)[大小];
上述方法允许您将任意大小的数组传递给此函数。但请注意,每个大小的模板都会创建不同的函数。如果函数的副作用改变了局部状态(ex的静态变量),则应谨慎使用

如果不想更改内容,请使用带参数的
const


如果您想在函数参数中复制数组,请考虑使用STL容器,如“代码> STD::数组< /COD>或 STD::向量< /代码>或嵌入在您的类中。

< P>,您的问题究竟是什么,您到底有什么问题,还不完全清楚,但无论如何我会尽力给您有用的答案。

首先,您所说的可能是
int[]
int*
(或其他类型),它本身不是数组。。。它是指向内存块的指针,可以像访问数组一样访问内存块。因为您只有一个指针,所以数组必须通过引用传递

其次,将数组作为“整个连续内存块”传递是相当低效的。。。传递点可能只涉及移动32或64位的值。使用内存缓冲区时,按引用传递通常是一件明智的事情,如果需要,可以显式地使用
memcpy
之类的函数来复制数据

第三,我不明白你所说的字符数组是“直接”可通过的,但其他类型的数组不能。在传递或存储字符数组时,字符数组并没有什么神奇之处。。。它们就像其他阵列一样。主要区别在于编译器允许您使用字符串文本来创建字符数组


最后,如果您使用C++ 11,您可能需要考虑新的<代码> STD::Load 类。它提供了各种便利设施,包括自动内存管理和跟踪自身大小。您可以通过值传递这些值,

template void foo(std::array bar)
或通过引用
template void foo(std::array&bar)
,这是您喜欢的。

您的问题并不完全清楚您正在尝试什么以及您遇到了什么问题,但无论如何,我都会尝试给您有用的答案

首先,您所说的可能是
int[]
int*
(或其他类型),它本身不是数组。。。它是指向内存块的指针,可以像访问数组一样访问内存块。因为您只有一个指针,所以数组必须通过引用传递

其次,将数组作为“整个连续内存块”传递是相当低效的。。。传递点可能只涉及移动32或64位的值。使用内存缓冲区时,按引用传递通常是一件明智的事情,如果需要,可以显式地使用
memcpy
之类的函数来复制数据

第三,我不明白你所说的字符数组是“直接”可通过的,但其他类型的数组不能。在传递或存储字符数组时,字符数组并没有什么神奇之处。。。它们就像其他阵列一样。主要区别在于编译器允许您使用字符串文本来创建字符数组


最后,如果您使用C++ 11,您可能需要考虑新的<代码> STD::Load 类。它提供了各种便利设施,包括自动内存管理和跟踪自身大小。您可以通过值传递这些值,

template void foo(std::array bar)
或通过引用
template void foo(std::array&bar)

您的第一个断言不完全正确,这使得问题很难回答。您不必显式地传递地址,因为数组在传递给需要指针的函数时会衰减为指针。
char
数组与任何其他类型的数组没有区别。但请注意,您可以