0

嘿伙计们,我正在尝试了解指针和数组的一些理论知识。我希望有人能重申我对指针和数组概念的一些怀疑。

假设我有这样的事情

int ia[] = {0,1,2,3,4,5};
ia[2];  // =2

int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia
ip[2]; // ??
ip[2] = 42; // 

大部分代码显然是理论上的,但我对最后两行有点不确定。首先是说 ip[2] 与说 ip 现在指向数组中的第二个元素一样吗?是否相当于说 *ip = ia[2] ?

我也对最后一行感到困惑。ip[2] = 42;所以ip指向的对象的第二个元素,那个地址的值是42?或者这是一种解除引用的数组表示法?我只是对发生的事情有点困惑。

4

4 回答 4

2

ia[n]是不同的写法*(ia+n),所以int* ip = &ia[0]是一样的int *ip = ia

您分配iaip. 这当然也ip[n] == ia[n]适用于 的所有值n

于 2013-03-21T06:05:35.150 回答
1

当你写a[i]它时,它被翻译为*(a+i)基地址(基本上是一个指针)

同样对于数组,基地址与第一个元素的地址a[0]相同,因此地址与a[ie a = &a[0]]相同

因此,ip[2] = 42;转换为*(ip+2) = 42 另外,* 在该地址给出值ip[2] = 42意味着*(ip+2) = 42即在该位置的值(ip+2)

于 2013-03-21T06:04:11.270 回答
1

下面创建一个名为 ia 的数组,并将大括号中的数字存储在数组中:

int ia[] = {0,1,2,3,4,5};

以下内容实际上什么都不做:

ia[2];

但是,如果我采用上述语句并进行如下更改,它会将值 2 分配给整数 t。这是因为 2 是 ia 中的第三个元素,而 ia[2] 引用了 ia 中的第三个元素。

t = ia[2];

如果您最初的 ia 声明是

int ia[] = {0,1,15,3,4,5};

那么你会将 t 分配给 15。

下面将 ia 中索引 2 处的值更改为 42:

ip[2] = 42;

现在,ia 由 {0,1,42,3,4,5} 组成。

这是因为 ia[2] 就像说 *(ia + 2)。如果将 ip 分配给 ia,则 ip 指向 ia 的第一个元素。

类似地,ip[2] 就像说 *(ip + 2)。因此,更改 ip[2] 将更改 ia[2],它们引用相同的内存块。

于 2013-03-21T06:06:57.470 回答
1

a[b]与 完全相同*(a + b)。总是。Soia[2]等价于*(ia + 2),并且ip[2]等价于*(ip + 2)

然而,它比这更微妙,因为iaip有非常不同的类型。ia是数组类型;而是ip指针类型。所以它们不是“相同的”——它们甚至不是同一类型的东西。这就像苹果和橘子。

在某些上下文中使用的数组表达式可以隐式转换为指向其第一个元素的指针。如果你写了 ,int *ip = ia;那将是一个隐式转换——ip现在指向 . 的第一个元素ia。和你写的一模一样int *ip = &ia[0];

同样,当您编写类似*(ia + 2)的内容时,在这种情况下,数组也被隐式转换为指向其第一个元素的指针,有点像*(&ia[0] + 2)。由于我们知道它ip指向 的第一个元素ia,因此当您ia在任何将其转换为指针的上下文中使用时,它与使用 的值相同ip。这就是为什么ia[2]ip[2]工作一样。

于 2013-03-21T09:20:14.777 回答