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

C 在数组中,&arr[2]返回什么?,c,arrays,C,Arrays,如果我们有一个数组[5],我们知道arr==&arr[0] 但是什么是&arr[2]= 还有,&arr给我们带来了什么 如果我们有一个数组[5],我们知道arr=&arr[0],但什么是&arr[2]= 在基于C的语言中,&arr[0]是指向数组中第一个元素的指针,&arr[2]是指向数组中第三个元素的指针。数组衰减为指向第一个元素的指针,因此在某些上下文中,数组和&arr[0]实际上是同一件事:指向第一个元素的指针 &arr[0] == arr + 0 &arr[1] == a

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

还有,&arr给我们带来了什么

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

在基于C的语言中,&arr[0]是指向数组中第一个元素的指针,&arr[2]是指向数组中第三个元素的指针。数组衰减为指向第一个元素的指针,因此在某些上下文中,数组和&arr[0]实际上是同一件事:指向第一个元素的指针

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

在基于C的语言中,&arr[0]是指向数组中第一个元素的指针,&arr[2]是指向数组中第三个元素的指针。数组衰减为指向第一个元素的指针,因此在某些上下文中,数组和&arr[0]实际上是同一件事:指向第一个元素的指针

&arr[0] == arr + 0
&arr[1] == arr + 1
&arr[2] == arr + 2
等等


在C++和C++中,如果t是一个基本类型,并且你有一个数组t数组[n],那么数组[i]是*数组+i,使用表达式数组衰减到表达式中的指针类型。

在C和C++中,如果t是一个基本类型,并且你有一个数组t数组[n],那么数组[i]是*数组+i,使用表达式数组在表达式中衰减为指针类型这一事实。

在c中,[]运算符和+运算符之间的唯一区别是,[]运算符还取消对指针的引用。这意味着arr[2]==*arr+2和&arr[2]==&*arr+2==arr+2

另一方面,这也意味着有趣的交互,您可以在其中引用数组索引,比如index[array]:也就是说,arr[2]==2[arr]


在c语言中,[]运算符和+运算符之间的唯一区别是,[]运算符也会取消对指针的引用。这意味着arr[2]==*arr+2和&arr[2]==&*arr+2==arr+2

另一方面,这也意味着有趣的交互,您可以在其中引用数组索引,比如index[array]:也就是说,arr[2]==2[arr]


您知道的越多……

让我们先看一个简单的例子:

int a;
a = 5;
在某种意义上,整数a有两个与之关联的值。你最喜欢的人 首先考虑的可能是右值,在本例中是数字5。 还有一种叫做左值的东西,发音为el值,它是 整数a所在的内存地址

这是一个需要把握的重要概念。在一天结束的时候,一切都结束了 关于记忆。我们将代码和变量存储在内存中。CPU执行 位于内存中的指令,它对以下数据执行操作: 也在记忆中。都是记忆。没有什么很复杂的;如果有人 试图用指针吓唬你别听,这都是记忆:

好的,对于一个数组,我们处理的是一个连续的数组块 用于存储相同类型数据的内存:

int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
正如您已经注意到的,数组的名称指的是 数组中的第一个元素,例如array==&数组[0]。在我的示例数组中 以上&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

让我们先看一个简单的例子:

int a;
a = 5;
在某种意义上,整数a有两个与之关联的值。你最喜欢的人 首先考虑的可能是右值,在本例中是数字5。 还有一种叫做左值的东西,发音为el值,它是 整数a所在的内存地址

这是一个需要把握的重要概念。在一天结束的时候,一切都结束了 关于记忆。我们将代码和变量存储在内存中。CPU执行 位于内存中的指令,它对以下数据执行操作: 也在记忆中。都是记忆。没有什么很复杂的;如果有人 试图用指针吓唬你别听,这都是记忆:

好的,对于一个数组,我们处理的是一个连续的数组块 用于存储相同类型数据的内存:

int array[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};
正如您已经注意到的,数组的名称指的是 数组中的第一个元素,例如array==&数组[0]。在我的示例数组中 以上&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

缺少语言标记。这是C吗?C++?PHP。。。我好奇它在C和C++中是如何不同的…..和ARR不返回任何东西。这不是一个函数。@悉达多:这两者都是一样的。悉达多:它们在C和C++中都是一样的。语言标记丢失了。这是C吗?C++?PHP。。。我好奇它在C和C++中是如何不同的…..和ARR不返回任何东西。它不是一个函数。
悉达多:这两者都是一样的。悉达多:它们在C和C++中都是一样的。我想‘ARR’是这样做的。”悉达多:ARR衰变到数组中第一个元素的指针。我想‘ARR’是这样做的。@悉达多:ARR衰变到数组中第一个元素的指针。AHHH我一直想知道Lv值是什么……我总是得到一个。当我使用“=”而不是“=”时,出现了“无效左值赋值”错误…现在它有意义了。我知道一切都是在记忆中发生的。。嗯,我不确定&array是否真的是一个有效的内存地址,但我把它放到codepad.org中,你是对的。我猜&array==&array[0]另外,我猜%p给出了左值是什么?如果是这样,那么%14p的作用是什么?Thx a ton:D%p是使用printf函数打印内存地址时使用的格式说明符。数字14告诉printf填充输出,直到它至少有14个字符宽;把它拿出来,看看输出的不同。我猜您正在阅读一本关于C编程语言的书,在几章中您将遇到有关指针和数组之间关系的信息。一旦你读到其他海报的其余评论可能更有意义。另外,我强烈建议您阅读Ted Jensen的这篇文档,它会澄清很多:啊,我一直想知道什么是左值…当我使用“=”而不是“=”,我总是会得到一个“无效的左值赋值”错误…现在这是有意义的。我知道一切都是在记忆中发生的。。嗯,我不确定&array是否真的是一个有效的内存地址,但我把它放到codepad.org中,你是对的。我猜&array==&array[0]另外,我猜%p给出了左值是什么?如果是这样,那么%14p的作用是什么?Thx a ton:D%p是使用printf函数打印内存地址时使用的格式说明符。数字14告诉printf填充输出,直到它至少有14个字符宽;把它拿出来,看看输出的不同。我猜您正在阅读一本关于C编程语言的书,在几章中您将遇到有关指针和数组之间关系的信息。一旦你读到其他海报的其余评论可能更有意义。另外,我强烈建议您阅读Ted Jensen的这篇文章,它将澄清很多问题: