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
-
我有一个指针,我分配给
array
。 -
然后我打印,我认为是第一个索引(
'2'
),而是得到1
。 – 所以,我假设*(ptr++)
实际上是取消引用,然后才增加指针。 -
然后我重新分配
ptr
第四个索引('4'
)并重复步骤2.这样就可以正常工作,因为我看到C在解除引用之前不会先计算括号。 -
然后我打印新增加的
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;
-
*(ptr ++)在解除引用后使指针前进。 如果您希望它获取数组中的第二个值,请使用
*(++ptr)
。 -
您正在为指针的值分配值。 实际上,您正在更改指针(指向第二个元素)以指向4.您根本没有真正更改指针位置。 所以你仍然在打印第二个元素,除了它现在的值为4。
-
你进入第3个元素,打印3。
ptr++
是后增量运算符,因此指针在取消引用后递增(根据标准)。
此外,步骤:
*ptr = array[3];
分配给array[1]
值4,因此您打印4而不是2并增加到3。
指针分配的正确方法是:
ptr = &array[3];
要么
ptr = (array + 3);
您实际上是通过ptr
将array[3]
的值赋给值pointet。