14

我无法弄清楚这一点。也许是因为现在是凌晨 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. 我有一个指针,我分配给array.

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

  3. 然后我重新分配第ptr4 个索引('4'

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

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

4

5 回答 5

19

让我们一步一步地看一下代码:

步骤 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])。

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

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

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

于 2013-07-14T06:13:38.017 回答
7

试试这个:

ptr = array + 3;
于 2013-07-14T06:09:57.593 回答
4

ptr++后增量运算符,因此指针在取消引用递增(根据标准)。

此外,步骤:

*ptr = array[3];

分配给array[1]值 4,因此您打印 4 而不是 2 并递增到 3。

于 2013-07-14T06:13:44.153 回答
4
  1. *(ptr++) 在解除引用后使指针前进。如果您希望它获得数组中的第二个值,请使用*(++ptr).

  2. 您正在为指针的值分配一个值。实际上,您正在将指针(指向第二个元素)更改为指向 4。您根本没有真正更改指针位置。所以你仍然在打印第二个元素,除了它现在的值为 4。

  3. 您前进到第 3 个元素,打印 3。

于 2013-07-14T06:14:25.503 回答
3

指针赋值的正确方法是:

ptr = &array[3];

或者

ptr = (array + 3);

您实际上是将 的值分配给array[3]值 pointet by ptr

于 2013-07-14T06:09:28.293 回答