[英]Passing array to function C++
关于C ++中数组的传递,我有一个简单的问题,我不明白。
基本上,当您要将整数类型的数组传递给另一个函数时,必须将地址传递给该数组,而不是直接传递整个连续内存块。 到底为什么呢?
另外,为什么可以将char数组直接传递给C ++中的另一个函数而无需传递地址呢?
我曾尝试在此网上寻找学习资料(例如cplusplus.com),但没有设法找到并解释。
丹,谢谢您的时间。
只要考虑到C ++,传递char arrays
和int arrays
是相同的。
有两种在c ++中传递数组的方法。
地址已通过
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]);
上面的方法允许您将任意大小的数组传递给此函数。 但是请注意,每种尺寸的模板都会创建不同的功能。 如果函数的副作用更改了局部状态(例如ex的静态变量),则应谨慎使用。
如果您不想更改内容,请在参数中使用const
。
如果要在函数参数中复制数组,请考虑使用stl容器(如std::array
或std::vector
或在您的类中嵌入数组。
从您的问题中还不能完全清楚您正在尝试什么以及遇到了什么问题,但是无论如何我都会尽力为您提供有用的答案。
首先,您所讨论的可能是int[]
或int*
(或其他类型),它本身不是数组……它是指向内存块的指针,可以像访问内存一样数组。 因为您所拥有的只是一个指针,所以该数组必须通过引用传递。
其次,将数组作为“连续内存的整个块”传递是相当低效的……传递该点可能只涉及移动32或64位值。 对于内存缓冲区,按引用传递通常是明智之举,如果需要,可以显式使用memcpy
功能来复制数据。
第三,我不理解您对char数组“直接”可传递的含义,但其他类型的数组则不能。 当传递或存储char数组时,没有什么神奇的……它们就像其他数组一样。 原则上的区别在于,编译器允许您使用字符串文字来创建char数组。
最后,如果您使用的是C ++ 11,则可能需要考虑新的std::array<T>
类。 它提供了各种方便的功能,包括自动内存管理和跟踪其自身大小。 您可以根据需要通过template<class T> void foo(std::array<T> bar)
或引用template<class T> void foo(std::array<T>& bar)
传递这些值。
您不能按值传递任何数组。 您可以通过值传递包含C ++ 11的数组或std::array
的结构。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.