[] 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 += 2
或 ptr++
)时,地址实际上递增了元素的大小。
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];
中的结果
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 += 2
或 ptr++
)时,地址实际上递增了元素的大小。
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];
中的结果