如果我们有一个数组[5],我们知道arr ==& arr [0] 但是什么是& arr [2] =?
此外,& arr会回报给我们什么?
答案 0 :(得分:2)
如果我们有一个数组[5],我们知道arr =& arr [0]但是什么是& arr [2] =?
在基于C语言中,&arr[0]
是指向数组中第一个元素的指针,而&arr[2]
是指向数组中第三个元素的指针。数组衰减成指向第一个元素的指针,因此在某些上下文array
和&arr[0]
实际上是同一个东西:指向第一个元素的指针。
答案 1 :(得分:2)
让我们先看一个简单的例子:
int a;
a = 5;
在某种意义上,整数 a 有两个与之相关的值。最你一个 可能首先考虑的是右值,在这种情况下是5号。 还有所谓的左值(发音为“el value”) 内存地址整数 a 位于。
这是一个需要掌握的重要概念。一切都结束了 关于记忆。我们将代码和变量存储在内存中。 CPU执行 位于内存中的指令,它对数据执行操作 也是在记忆中。这一切都只是记忆。没有什么复杂的;如果有人 试图用指针吓唬你不要听,这只是记忆:)
好吧,所以,在数组的情况下,我们正在处理一个连续的块 用于存储相同类型数据的内存:
int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
正如您已经注意到的那样,数组的名称是指内存的位置 数组中的第一个元素(例如array ==& array [0])。所以在我的示例数组中 above& array [2]将引用包含的内存位置(或左值) 数组中的第三个元素。
要回答您的其他问题&数组只是另一个内存地址,请查看是否 此代码段有助于清除它指向的内容:)
#include <stdio.h>
#include <stdlib.h>
int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
int main(void) {
printf("&array[2] is: %p\n", &array[2]);
printf("&array[0] is: %p\n", &array[0]);
printf("&array is: %14p\n", &array);
exit(0);
}
% gcc test.c
% ./a.out
&array[2] is: 0x100001088
&array[0] is: 0x100001080
&array is: 0x100001080
答案 2 :(得分:1)
&arr[0] == arr + 0
&arr[1] == arr + 1
&arr[2] == arr + 2
等等。
答案 3 :(得分:1)
在C和C ++中,如果T
是基本类型,并且您有一个数组T array[N]
,则array[i]
为*(array+i)
,使用表达式array
衰减到表达式中的指针类型。
答案 4 :(得分:1)
在c中,[]
运算符与+
运算符之间的唯一区别是[]
运算符也取消引用指针。这意味着arr[2] == *(arr + 2)
和&arr[2] == &(*(arr + 2)) == arr + 2
。
另外,这也意味着有趣的互动,你引用像index[array]
这样的数组索引:即arr[2] == 2[arr]
。
你知道的越多......