C和C ++允许按值将结构和对象传递给函数,尽管可以防止按值传递数组。
为什么?
在C / C ++中,内部将数组作为指向某个位置的指针传递,基本上,它[[is通过值传递。事实是,复制的值表示相同位置的内存地址。
顺便说一下,在C ++中,vector<T>
被复制并传递给另一个函数。 我认为该决定是为了提高效率。大多数情况下,您都不想这样做。这与为什么没有无符号双打的原因相同。没有相关的CPU指令,因此您必须使诸如C ++之类的效率低下的事情变得非常困难。
正如@litb提到的:“ C ++ 1x和boost都将本机数组包装到提供std :: array和boost :: array的结构中,我一直希望使用它,因为它允许在结构中传递和返回数组”
数组是指向保存该数组和大小的内存的指针。请注意,它与指向数组第一个元素的指针不完全相同。
大多数人认为您必须将数组作为指针传递,并将大小指定为单独的参数,但这不是必需的。您可以传递对实际数组本身的引用,同时保持其sizeof()状态。
//Here you need the size because you have reduced
// your array to an int* pointing to the first element.
void test1(int *x, int size)
{
assert(sizeof(x) == 4);
}
//This function can take in an array of size 10
void test2(int (&x)[10])
{
assert(sizeof(x) == 40);
}
//Same as test2 but by pointer
void test3(int (*x)[10])
{
assert(sizeof(*x) == 40);
//Note to access elements you need to do: (*x)[i]
}
有人可能说数组的大小未知。这不是真的。
int x[10]; assert(sizeof(x) == 40);
但是堆上的分配呢?堆上的分配不会返回数组。它们返回一个指向数组第一个元素的指针。因此,new不是类型安全的。如果确实有一个数组变量,那么您将知道该变量的大小。
原始答案
一方面,它怎么知道要分配多少堆栈?这对于结构和对象是固定的(我相信),但是对于数组,它取决于数组的大小,直到执行时才知道。 (即使每个调用者在编译时都知道,可能会有不同的调用者使用不同的数组大小。)您可以在参数声明中强制使用特定的数组大小,但这似乎有些奇怪。此外,正如Brian所说,还有效率问题。
您想通过所有这些实现什么?是否要确保不更改原始数组的内容?
naked