将数组传递给C++;,为什么赢了';t sizeof()的工作原理与主函数中的相同吗? P> >我的C++老师在课堂上告诉我们,没有函数来确定C++中的数组大小,我对此并不满意。我在这里发现了一个关于stackoverflow的问题,它给出了这段代码(sizeof(array)/sizeof(*array)),虽然我不完全理解它,但我理解它将占用分配给数组的内存总量,并将其除以我假设的数据类型的默认内存分配…(?) 我决定要练习编写函数(我在CS 111-1中),并编写一个函数,返回我传递给它的任何数组中的元素数。这是我写的: #include <iostream> using namespace std; int length_of_array(int some_list[]) { // This only returns the integer 1 for some reason return (sizeof(some_list)/sizeof(*some_list)); } int main() { // Declare and initialize an array with 15 elements int num_list[] = {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}; //Outputs what I assume is the total size in bytes of the array cout << sizeof(num_list) << endl; //Outputs what I assume to be size of memory set aside for each in element in an array cout << sizeof(*num_list) << endl; //This extrapolates array's number of elements cout << "This is the output from direct coding in the\nint main function:\n" << (sizeof(num_list)/sizeof(*num_list)) << endl; //This function should return the value 15 but does not int length = length_of_array(num_list); cout << "This is the length of the array determined\n"; cout << "by the length_of_array function:\n" << length << endl; return 0; } #包括 使用名称空间std; 数组的整数长度(整数部分列表[]) { //由于某种原因,它只返回整数1 返回(sizeof(some_list)/sizeof(*some_list)); } int main() { //声明并初始化一个包含15个元素的数组 int num_list[]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}; //输出我假设的是数组的总大小(以字节为单位) cout

将数组传递给C++;,为什么赢了';t sizeof()的工作原理与主函数中的相同吗? P> >我的C++老师在课堂上告诉我们,没有函数来确定C++中的数组大小,我对此并不满意。我在这里发现了一个关于stackoverflow的问题,它给出了这段代码(sizeof(array)/sizeof(*array)),虽然我不完全理解它,但我理解它将占用分配给数组的内存总量,并将其除以我假设的数据类型的默认内存分配…(?) 我决定要练习编写函数(我在CS 111-1中),并编写一个函数,返回我传递给它的任何数组中的元素数。这是我写的: #include <iostream> using namespace std; int length_of_array(int some_list[]) { // This only returns the integer 1 for some reason return (sizeof(some_list)/sizeof(*some_list)); } int main() { // Declare and initialize an array with 15 elements int num_list[] = {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}; //Outputs what I assume is the total size in bytes of the array cout << sizeof(num_list) << endl; //Outputs what I assume to be size of memory set aside for each in element in an array cout << sizeof(*num_list) << endl; //This extrapolates array's number of elements cout << "This is the output from direct coding in the\nint main function:\n" << (sizeof(num_list)/sizeof(*num_list)) << endl; //This function should return the value 15 but does not int length = length_of_array(num_list); cout << "This is the length of the array determined\n"; cout << "by the length_of_array function:\n" << length << endl; return 0; } #包括 使用名称空间std; 数组的整数长度(整数部分列表[]) { //由于某种原因,它只返回整数1 返回(sizeof(some_list)/sizeof(*some_list)); } int main() { //声明并初始化一个包含15个元素的数组 int num_list[]={2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}; //输出我假设的是数组的总大小(以字节为单位) cout,c++,arrays,function-calls,C++,Arrays,Function Calls,问题在于: int length_of_array(int some_list[]); 基本上,当您将数组作为函数的参数传递时,无论是像int-arr[]或int-arr[42]这样传递数组,数组都会衰减为指针(有一个例外,请参见下文),因此上面的签名相当于 int length_of_array(int* some_list); 因此,当然,在执行sizeof(some_list)/sizeof(*some_list)时,您将得到数组衰减到的指针大小与表示第一个元素的类型大小之间的比率。在

问题在于:

int length_of_array(int some_list[]);
基本上,当您将数组作为函数的参数传递时,无论是像
int-arr[]
int-arr[42]
这样传递数组,数组都会衰减为指针(有一个例外,请参见下文),因此上面的签名相当于

int length_of_array(int* some_list);
因此,当然,在执行
sizeof(some_list)/sizeof(*some_list)
时,您将得到数组衰减到的指针大小与表示第一个元素的类型大小之间的比率。在您的情况下,指针的大小可能是4字节(32位),与
int
的大小相同

<> P> >我的C++老师在课堂上告诉我们,没有一个函数来决定C++中的数组大小,我对它不满意。 您的老师错了!有一种方法可以通过引用传递数组并获取其大小:

template<size_t N>
int length_of_array(int (&arr)[N])
{
    std::cout << N << std::endl; // WORKS!
    return N;
}
模板
数组的整数长度(整数(&arr)[N])
{

Std::Cuffic函数实际上不能把数组当作参数。当传递给函数时,数组会变成指针。这不是一个问题的复制品。这是关于C的,这是关于C++的。正如这里的答案所示,有一个重要的区别。在C.你不能使用那个模板技巧,所以我投票赞成Roop.恩。那么,如果它有一个完全不同的答案,那么它怎么会是重复的呢?被接受的答案能适用于你说我重复的问题吗?重复:这并不是完全错误的。没有函数来确定数组大小。你可能已经找到了一种方法来确定数组大小,但即使这样,它也不能用于动态分配的数组。但无论如何,一个很好的方法诀窍。我想知道为什么它在没有引用的情况下不工作?因为即使你明确声明了它的大小,它也会衰减为指针?@SergeyTachenov从技术上说你是对的,尽管我很确定老师的意思是,不管你如何传递数组,你都不能得到它的大小。当通过引用传递它时,函数实际上使用参数的确切类型,在本例中为
int[N]
。例如,如果您除去模板,但只执行
void f(int(&arr)[10]),那么你将无法通过不同于<代码> 10 < /C>的大小数组。因为使用模板可以检测<代码> n>代码>,使用模板有点好。@ DISKYLE错误数组在C和C++中有点棘手。它们是强类型,换句话说,<代码> int ARR1(10)< /C>和<代码> int AR2(20)。
表示两种不同的不兼容类型。但是,当按值向函数传递数组时,数组将衰减为指针,因此类型信息将被“擦除”并简单地变成指针。按引用传递时除外。
int(&arr)[10]
表示
arr
是对
int[10]的引用
array。在我的代码中,我使用了一个模板,因此您可以传递任意大小的数组(编译器将推断
N
,因为它知道数组的完整类型)@SergeyTachenov是的,如果你不通过引用传递,那么类型只会衰减为指针。我相信这一点的最初动机来自于
C
,在那时效率是最重要的(现在仍然如此)所以复制数组是不可取的。@vsoftco谢谢。我似乎对我的课本有了更多的阅读。我们实际上还没有讨论过指针。我们刚刚完成数组是什么……我只是好奇。当我出于某种原因学习一个新概念时,我的第一反应是测试边界。再次感谢