C - 指针和不同的结果?

she*_*lbc 14 c pointers

我无法弄清楚这一点.也许是因为凌晨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;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

1
2
4
3
Run Code Online (Sandbox Code Playgroud)
  1. 我有一个指针,我指定array.

  2. 然后我打印,我认为将是第一个索引('2'),而是得到1.- 所以,我假设它*(ptr++)实际上是取消引用,然后才增加指针.

  3. 然后我重新分配ptr第四个索引('4')并重复步骤2.这样就可以正常工作,因为我看到C在解除引用之前不会先计算括号.

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

那是怎么回事,第1步和第2步以及第3步和第4步是相同的,但是我得到了不同的结果?

Nob*_*lis 19

让我们一步一步地完成代码:

第0步:

char* ptr = array;
Run Code Online (Sandbox Code Playgroud)

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

步骤1:

printf("%c\n", *(ptr++));
Run Code Online (Sandbox Code Playgroud)

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

第2步:

printf("%c\n", *ptr);
Run Code Online (Sandbox Code Playgroud)

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

第3步:

*ptr = arr[3];
Run Code Online (Sandbox Code Playgroud)

取消引用位置1处的指针并使用数组位置3处的值更新指向的值.这是值4.

第4步:

printf("%c\n\n", *(ptr++));
Run Code Online (Sandbox Code Playgroud)

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

第5步:

printf("%c\n", *ptr);
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,ptr由于运算符优先级,上面的括号实际上是冗余的.

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

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


Yu *_*Hao 7

试试这个:

ptr = array + 3;
Run Code Online (Sandbox Code Playgroud)

  • @slebetman错了.非常错误.不能是wronger.指针算法由编译器自动执行.在进行指针运算时,你明确地不能乘以`sizeof(T)`.** (6认同)
  • (或许我应该停止强调语言**:P) (2认同)