C – 指针和不同的结果?

我无法弄清楚这一点。 也许是因为凌晨2点。 无论如何,我在这里不知所措。

#include  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. 然后我重新分配ptr第四个索引( '4' )并重复步骤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]的地址)。

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

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

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

试试这个:

 ptr = array + 3; 
  1. *(ptr ++)在解除引用后使指针前进。 如果您希望它获取数组中的第二个值,请使用*(++ptr)

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

  3. 你进入第3个元素,打印3。

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

此外,步骤:

 *ptr = array[3]; 

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

指针分配的正确方法是:

 ptr = &array[3]; 

要么

 ptr = (array + 3); 

您实际上是通过ptrarray[3]的值赋给值pointet。