C中&array和&array [0]之间的区别

时间:2019-03-01 04:48:09

标签: c arrays pointers

考虑此声明:

int array [] = ....;

我知道&array [0] 具有第一个元素的地址作为其值。

但是&array 呢?我在程序中尝试过此操作,它还返回了第一个元素的地址。那有什么区别?

2 个答案:

答案 0 :(得分:3)

尝试“ 'A'65LL65.0之间的区别?

所有的值都彼此相等(假设为ASCII),但是具有不同的类型和可能不同的位宽和编码。

现在“ &array&array[0]之间的差异”

两者的值都等同于指向内存中同一位置的点,但它们的 type 有所不同:指向int数组的指针与指向{{1的指针}}。

int

这种类型差异的常见影响是指针数学

int a[] = {1,2,4};
// &a is a `pointer to array 3 of int`

[高级]:尽管通常两个指针使用相同的编码和大小,但是在C语言中,它们可以在编码和大小上有所不同,同时仍指向相同的地址。

答案 1 :(得分:1)

当您声明int的数组时,就像您所做的int array[] = { 1, 2, 3 };等一样,编译器所做的工作是在堆栈上为(在这种情况下)连续三个整数保留了空间”(在函数执行期间保留局部变量的内存空间)。该空间的名称为array

采用第一个元素的地址(如&array[0]),可以按预期方式获得这些整数中第一个的地址。该地址指向函数的堆栈框架内的一小块内存。

在第二种情况下,您要输入“称为array的变量”的地址,对吗?好吧,那个变量是...堆栈上的这三个整数。该对象的地址与第一个元素的地址相同。这就是为什么这些值相同的原因。


您注意到您的教科书上说后一版本实际上是未知的。我不是这方面的标准专家,但这是有道理的-使用第二种形式并不是真的习惯,因为您可以说array代表同样的事情并且更明智。

但是,如果动态分配该数组,情况就会改变。如果您这样做:

int * dynamic_array = malloc(3 * sizeof(int));

...实际上,您仍然创建了一个“数组”,但是这三个整数的存储不再在堆栈中;它是从堆中动态分配的。在这种情况下,&dynamic_array[0]仍会为您提供第一个元素的地址。该地址与变量dynamic_array 中包含的值相同。请注意,在这种情况下,与说&dynamic_array不相同。在这里获取指针dynamic_array的地址将为您提供堆栈中 pointer 的地址(即int **)。