首页 > 解决方案 > 为什么这个指针是 8 个字节?

问题描述

我正在学习 C++,并读到当一个数组被传递给一个函数时,它会衰减为一个指针。我想玩这个并编写了以下函数:

void size_print(int a[]){
    cout << sizeof(a)/sizeof(a[0]) << endl;
    cout << "a ->: " << sizeof(a) << endl;
    cout << "a[0] ->" << sizeof(a[0]) << endl;
}

我尝试输入一个包含三个元素的数组,比如说

int test_array[3] = {1, 2, 3};

有了这个输入,我期待这个函数打印 1,因为我认为a这将是一个整数指针(4 个字节),a[0]也将是 4 个字节。然而,令我惊讶的是,结果是 2 和sizeof(a) = 8.

我不知道为什么a占用了 8 个字节,但a[0]占用了 4 个。它们不应该是一样的吗?

标签: c++arraysfunctionpointers

解决方案


他们不应该是一样的吗?

No.a是(应该是)一个数组(但因为它是一个函数参数,已被调整为指向第一个元素的指针),因此具有指针的大小。您的机器似乎有 64 位地址,因此,每个地址(因此,每个指针)都是 64 位(8 字节)长。

a[0]另一方面,该数组的元素具有 (an int) 的类型,并且该类型在您的机器上具有 32 位(4 个字节)。


推荐阅读