我无法弄清楚这一点.也许是因为凌晨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)
我有一个指针,我指定array.
然后我打印,我认为将是第一个索引('2'),而是得到1.- 所以,我假设它*(ptr++)实际上是取消引用,然后才增加指针.
然后我重新分配ptr第四个索引('4')并重复步骤2.这样就可以正常工作,因为我看到C在解除引用之前不会先计算括号.
然后我打印新增加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).这里即使预增量和间接具有相同的优先级,它们也是从右到左进行计算的.因此指针将在取消引用之前递增.
试试这个:
ptr = array + 3;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
648 次 |
| 最近记录: |