考虑此声明:
int array [] = ....;
我知道&array [0] 具有第一个元素的地址作为其值。
但是&array 呢?我在程序中尝试过此操作,它还返回了第一个元素的地址。那有什么区别?
答案 0 :(得分:3)
尝试“ 'A'
,65LL
和65.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 **
)。