在f()中,我接受最大大小为4的数组,但是当我传递大于4(这里为10)的大小的数组时,它仍然可以正常运行,我知道c ++中的数组默认作为指针传递,但是这种传递数组的方法何时有用?
#include<iostream>
using namespace std;
void f(int a[4]){
for(int i = 0;i < 3;i++){
a[i] += 10;
}
}
int main(){
int a[10];
for(int i = 0;i < 10;i++)
a[i] = i;
f(a);
for(int i =0 ;i < 10;i++){
cout<<a[i]<<" ";
}
cout<<"\n";
return 0;
}
输出:10 11 12 3 4 5 6 7 8 9
答案 0 :(得分:4)
我知道c ++中的数组默认情况下作为指针传递
正确。
此:
void foo(int a[4])
完全重写为:
void foo(int* a)
…,然后在调用该函数时,数组的名称将衰减为指针,与重写的“真实”参数类型匹配。
因此,您根本没有真正传递数组。
这种传递数组的方法何时有用?
从不。
这是继承自C的可耻的奇怪之处。有人可能会说[4]
是对开发人员的有用提示,指出指向数组“应该”包含四个元素,但是现代的智慧是,这仅仅是不必要和危险的误导。
更好的选择包括:
std::array<int, 4>
(通过引用):如上所述,但更简洁答案 1 :(得分:2)
如果要对传入数组的大小施加限制,则可以更改为“按引用传递”。
void f(int (&a)[4]){
for(int i = 0;i < 3;i++){
a[i] += 10;
}
}
void f(int a[4])
与void f(int* a)
相同;这意味着您可以传递任何大小的数组,该大小在传递时会衰减到指针(即int*
)。
答案 2 :(得分:2)
要么像{songyuanyao所示那样对f()
进行更严格的限制,要么考虑使用C ++ std::array
来代替:
#include <iostream>
#include <array>
// make an alias for the array you'd like to accept
using myarray_t = std::array<int, 4>;
// accept the array by reference
void f(myarray_t& a) {
// use a range based for loop to access elements by reference
for(int& a_i : a) a_i += 10;
}
int main() {
// declare your array
myarray_t a;
for(size_t i = 0; i < a.size(); ++i) a[i] = static_cast<int>(i);
f(a);
// and you can use a range based for loop to extract by value too
for(int a__i : a)
std::cout << a_i << " ";
std::cout << "\n";
return 0;
}