为什么在以下函数中n不等于8?
1 2 3 4
| void foo(char cvalue[8])
{
int n = sizeof (cvalue);
} |
但是在此版本的函数中,n等于8:
1 2 3 4 5
| void bar()
{
char cvalue[8];
int n = sizeof (cvalue);
} |
因为您不能在C中将整个数组作为函数参数传递。实际上,您正在传递指向它的指针。括号是语法糖。不能保证您要指向的数组的大小为8,因为您可以将所需的任何字符指针传递给此函数。
1 2 3 4
| // These all do the same thing
void foo(char cvalue[8])
void foo(char cvalue[])
void foo(char *cvalue) |
C和C ++数组不是一流的对象。您不能将数组传递给函数,它们总是衰减到指针。
但是,您可以将指针和引用传递给数组。这样可以防止数组边界衰减。所以这是合法的:
1 2 3 4 5
| template<typename T, size_t N>
void foo(const T(&arr)[N])
{
int n = sizeof(arr);
} |
在第一个示例中,cvalue作为传递的参数实际上只是一个指向字符数组的指针,当您使用它的sizeof()时,您将获得该指针的大小。在第二种情况下,您已将其声明为局部变量,则可以获取整个数组的大小。
在32位系统上,参数的大小为4,而在使用-m64编译的64位系统上,参数的大小为8。这是因为数组在函数中作为指针传递。指针仅仅是一个存储器地址。