在数组中,& arr [2]返回什么?

时间:2011-10-13 23:39:24

标签: c arrays

如果我们有一个数组[5],我们知道arr ==& arr [0] 但是什么是& arr [2] =?

此外,& arr会回报给我们什么?

5 个答案:

答案 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]

你知道的越多......