[] c 中的指针操作

[] pointers operations in c

int x[4] = {12, 20, 39, 43}, *y;        y = x;  Assume each expression is evaluated after the previous one (take all previous ones in consideration)
*y + 1
*(y + 1) y += 2; 
*y = 38
*y - 1
*y++
*y  
y[0]   [Hint: y is not pointing to x[0] anymore so think about it and search for what it means]

这是我要解决的问题

1: y[0] 是什么意思?

我在网上搜索了一无所获!

2:(*y-1) 运算是从左到右计算的吗? y 会指向它现在指向的元素之前的元素吗?

谢谢

指针是内存中的地址。

如果你有一个int*,它就是一个int的地址。

现在你有两种不同的方式来访问这个地址的值。

int a = 1;
int *ptr = &a; // ptr is the address of a

printf("%d\n", *ptr); // should print "1" because *ptr is the content at the address stored in ptr

现在当我们使用数组时,这种语法不容易阅读,所以有另一种语法是:

int array[4] = { 21, 42, 84, 64 };
// Here array is also an address, the address of the first element

printf("%d\n", array[1]); // this should print "42"

事实上,当您使用数组语法 aka array[1] 时,就好像您在使用 *(array + 1).

这也是为什么数组的第一个元素是 [0],因为这就像你在做 *(array + 0)

所以当你有一个指针(或一个数组,它是一样的)时,*ptr == ptr[0]

我会用一个例子来回答你的问题:

int x[4] = {12, 20, 39, 43}, *y;
y = x;
*y + 1; // 13
*(y + 1); // 20 (same as y[1])
y += 2; // y is now the address of 39
*y = 38; // { 38, 43 }
*y - 1; // 37
*y++; // 43 (y++ then *y)
*y; // 43
y[0]; // 43

“*”运算符适用于他右侧的整个块。 *y + 1 is like y[0] + 1*(y + 1) 就像 y[1]`

当您递增指针(通过 ptr += 2ptr++)时,地址实际上递增了元素的大小。

int y = 42;
int *ptr = &y;

ptr += 2; // ptr is now 8 bytes (2 * syzeof(int)) further &y

编辑: 如果你想了解更多关于操作员优先级的细节,你也可以看看这个link。 http://en.cppreference.com/w/c/language/operator_precedence

让我们逐步完成此操作:

int x[4] = {12, 20, 39, 43}, *y;

这为 x 声明并初始化了一个包含 4 个整数值的数组。它还声明了 y 并保留 space 来存储 y 的地址。

y = x;

这里发生的事情是数组 x 已经衰减为指向 x 的第一个元素的地址的指针;在代码中:

y = &(x[0]);

下一个:

*y + 1;

这个表达式是指针算术的一种形式,从右到左计算;首先,它将 1 加到 y(y 现在指向 x[1]),然后取消对 y 的引用。请注意,在语句执行结束时,y 的原始值被恢复:该值从未被存储。 (这将与增量运算符不同。)

下一个表达式在功能上相同(但更清晰)。

y += 2;

这使 y 前进了 2 个偏移量;它等效于编写以下内容:(y 现在指向 x[2] 的地址)

y = y[2];

下一个:

*y = 38;

y 当前指向地址 x[2]。 x[2] 的值被覆盖了,因为我们解引用了指向该地址的指针并为其分配了一个新值。 x[2] 现在等于 38 而不是 39。

*y - 1;

同样,从右到左的指针运算;返回值是 x[1] 的地址,但该值丢失了,因为它没有存储在任何地方。

*y++;

y 现在指向 x[3]。该函数取消引用存储在 x[2] 中的值(请注意,y 是在表达式完成执行后分配的)但未使用该值。

*y;

这只是取消对 y 的引用,但它本身并没有做任何事情。

y[0];

功能上等同于前面的语句;它产生存储在 x[3];

中的结果