gpt4 book ai didi

C - 指针和不同的结果?

转载 作者:太空狗 更新时间:2023-10-29 16:34:54 25 4
gpt4 key购买 nike

我想不通。也许是因为现在是凌晨 2 点。无论如何,我在这里不知所措。

#include <stdio.h>

int main()
{
char array[] = "123456789";
char* ptr = array;

printf("%c\n", *(ptr++));
printf("%c\n", *ptr);

*ptr = array[3];
printf("%c\n", *(ptr++));
printf("%c\n\n", *ptr);

return 0;
}

结果是:

1
2
4
3
  1. 我有一个指针,我将其分配给数组

  2. 然后我打印,我认为是第一个索引 ('2'),但得到的是 1。-- 所以,我假设 *(ptr++) 在递增指针之前实际上取消了引用。

  3. 然后我将第 4 个索引 ('4') 重新分配给 ptr 并重复第 2 步。现在这按预期工作了我看到 C 在取消引用之前不会先计算括号。

  4. 然后我打印新增加的 ptr 以显示 ('5') ... 我得到 3?

这是怎么回事,步骤 1&2 和 3&4 是相同的,但我得到不同的结果?

最佳答案

让我们逐步查看代码:

第 0 步:

char* ptr = array;

将char指针指向数组的开头(即位置0)。

第 1 步:

printf("%c\n", *(ptr++));

取消引用位置 0 处的指针,打印驻留在那里的值 (1),然后将指针递增到位置 1

第 2 步:

printf("%c\n", *ptr);

取消引用位置 1 的指针并打印驻留在那里的值 (2)

第 3 步:

*ptr = arr[3];

解除对位置 1 的指针的引用,并更新指向数组位置 3 的值。这是值 4。

第 4 步:

printf("%c\n\n", *(ptr++));

取消引用位置 1 的指针,打印我们刚刚更新的值 (4),然后将指针递增到位置 2

第 5 步:

printf("%c\n", *ptr);

取消引用位置 2 处的指针并打印那里的值 (3)。

也许您真正想要的是 ptr = &arr[3]; 它将指针分配给一个新位置(即 arr[3] 的地址).

请注意,由于 operator precedence,上面 ptr 周围的大括号实际上是多余的.

对于 *(ptr++) 的情况,后增量的优先级高于间接,因此它会在我们取消引用指针之前应用

*(++ptr) 也不需要大括号。在这里,即使预递增和间接具有相同的优先级,它们也是从右到左求值的。因此指针将在取消引用之前递增。

关于C - 指针和不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17636969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com