use*_*748 5 c++ arrays pass-by-reference
我知道当我想将一个数组传递给一个函数时,它会衰减成指针,所以它的大小不会被知道,这两个声明是等价的:
void funtion(int *tab, int size);
Run Code Online (Sandbox Code Playgroud)
和
void funtion(int tab[], int size);
Run Code Online (Sandbox Code Playgroud)
我理解为什么.但是,当我传递一个数组作为参考时,我检查过:
void funtion(int (&tab)[4]);
Run Code Online (Sandbox Code Playgroud)
编译器将知道数组的大小,并且不允许我传递不同大小的数组作为此函数的参数.
这是为什么?我知道当我按地址传递数组时,在计算数组中第i个元素的位置时不会考虑大小,所以即使我在函数声明中明确地包含它,它也会被丢弃:
void funtion(int tab[4], int size);
Run Code Online (Sandbox Code Playgroud)
但是当我通过引用传递数组时有什么不同?为什么编译器知道它的大小?
注意:我对编译时已知大小的数组感兴趣,所以我没有使用任何模板.
我在Stack Overflow上发现了类似的问题,但它没有回答我的问题 - 它没有解释为什么编译器知道数组的大小,只有一些关于如何将数组传递给函数的信息.
因为它可以,并且因为检查增加了额外的安全性.编译器知道数组的大小,因为你告诉它,就在函数声明中.既然该信息可用,为什么不用它来表示源代码中的错误?
真正的问题是为什么你的最后一个例子不会做同样的检查.不幸的是,这是C遗留的另一部分 - 你永远不会传递一个数组,它总是衰变成一个指针.然后数组的大小变得无关紧要.
可以添加支票吗?可能,但它的用途有限(因为我们现在都使用std :: array - 对!?),因为它无疑会打破一些代码.这个,例如:
void func (char Values [4]);
func ("x");
Run Code Online (Sandbox Code Playgroud)
这是合法的,但不会额外检查数组大小.