2014-10-30 62 views
1

所以平时当你输入函数参数数组声明他们是这样的:这些数组类型有何不同?

f (const float offset [ 3 ]) 

但我一直在努力有他们的项目申报,像这样:

f (const float (&offset) [ 3 ]) 

那有什么改变什么意思?据我所知,我们已经有效地传递了一个指针。强制这样的参考甚至是什么呢?

+0

牢记数组不是指针和该签名只是自动的改变为指针在第一种情况下,因为它是一个函数参数的变化相当大的。它不再接受指针参数。 – chris 2014-10-30 03:20:34

+0

目前尚不清楚,似乎'f'是一个函数调用,所以'offset'可能是'float **'。添加更多代码! – gmas80 2014-10-30 03:22:24

回答

3
f (const float offset [ 3 ]) 

在这种情况下,3是无意义的。 offset甚至不是一个数组,它是一个指针(const float*)。所以这个函数将接受任何浮点指针,并且任何大小的浮点数都会被衰减接受。

float x2[2]; 
float x3[3]; 
float x4[4]; 
float* fp; 

f(x2);  // compiles 
f(x3);  // compiles 
f(x4);  // compiles 
f(fp);  // compiles 

此外,在该函数内:

sizeof(offset) == sizeof(float*) 

然而,

f (const float (&offset) [ 3 ]) 

在这种情况下,offset是3常量漂浮数组的引用。只有3个花车阵列才会被接受为参数。

f(x2);  // does not compile 
f(x3);  // compiles 
f(x4);  // does not compile 
f(fp);  // does not compile 

而且里面的功能:

sizeof(offset) == sizeof(float) * 3 
+0

我的下一个问题是为什么括号是必需的?如果我不在MSVC2010中使用它们,则会出现错误,指出不允许引用数组。这只是MSVC的一个怪癖,或者类型符号的优先级是如何工作的? – BlamKiwi 2014-10-30 03:33:52

+0

@MorphingDragon:哪个括号?括号?是的,它们是必要的,这正是编译器告诉你的原因。没有它们,编译器会认为你正在试图声明一个引用数组(而不是对数组的引用),这是不允许的。 – 2014-10-30 03:40:44