一、传递数组名(实际上传递的是指向数组首元素的指针)「同C一样」
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printArray(arr, size);
return 0;
}
二、使用指针参数传递数组 「同C一样」
与传递数组名类似,效果是一样的。
void printArray(int* arr, int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printArray(arr, size);
return 0;
}
三、传递数组的引用
这种方式可以明确地知道传递的是一个数组,并且避免了数组退化为指针的情况。
相当于写死了长度,这样是很不好的,要想传递长度,还是得使用模板参数传递。
void printArray(int(&arr)[5]) {
for (int i = 0; i < 5; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printArray(arr);
return 0;
}
注意,在这种方式中,必须明确指定数组的大小,否则会导致编译错误。
四、使用模板参数推导传递数组 【推荐】
1、可以使用模板函数来自动推导数组的大小。
template <typename T, size_t N>
void printArray(T(&arr)[N]) {
for (size_t i = 0; i < N; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printArray(arr);
return 0;
}
2、使用模板函数和迭代器
#include <iostream>
#include <iterator>
template<typename T>
void processArray(T arr[]) {
int length = std::distance(std::begin(arr), std::end(arr));
std::cout << "Length of array: " << length << std::endl;
for (int i = 0; i < length; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
processArray(arr);
return 0;
}
这种方式利用了迭代器来计算数组的长度。但需要注意的是,这里的实现假设传入的数组有明确的结束位置,不能是未初始化或不完整的数组。
五、传递数组的引用,并在调用函数中计算长度
也就相当于传递了结束符,也相当于传递了多一个参数。
#include <iostream>
void processArray(int(&arr)[], int* endPtr) {
int length = endPtr - arr;
std::cout << "Length of array: " << length << std::endl;
for (int i = 0; i < length; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
processArray(arr, std::end(arr));
return 0;
}
这里使用了std::end(arr)
来获取数组末尾的指针,通过计算与数组首地址的差值得到长度。
小结:
C++要想和其他现代语言一样,通过传递数组的名字,就能够传递过去数组(包括长度), 就要使用模板参数。
综上: 还是传模板比较好。
Last updated