为了理解C语言中指针的行为,我对以下内容(以下示例代码)感到有些惊讶:#include <stdio.h>void add_one_v1(int *our_var_ptr){ *our_var_ptr = *our_var_ptr +1;}void add_one_v2(int *our_var_ptr){ *our_var_ptr++;}int main(){ int testvar; testvar = 63; add_one_v1(&(testvar)); /* Try first version of the function */ printf("%d\n", testvar); /* Prints out 64 */ printf("@ %p\n\n", &(testvar)); testvar = 63; add_one_v2(&(testvar)); /* Try first version of the function */ printf("%d\n", testvar); /* Prints 63 ? */ printf("@ %p\n", &(testvar)); /* Address remains identical */}输出:64@ 0xbf84c6b063@ 0xbf84c6b0*our_var_ptr++由于第二个函数(add_one_v2)中的语句显然与之不同,因此该语句究竟能做什么*our_var_ptr = *our_var_ptr +1?
3 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
这是使C和C ++变得如此有趣的那些小陷阱之一。如果您想弯曲您的大脑,请找出这一点:
while (*dst++ = *src++) ;
这是一个字符串副本。指针不断递增,直到复制了值为零的字符。一旦知道了这种技巧的作用,您将永远不会忘记++如何再次处理指针。
PS您始终可以用括号覆盖运算符顺序。以下将增加所指向的值,而不是指针本身:
(*our_var_ptr)++;
慕容3067478
TA贡献1773条经验 获得超3个赞
好,
*our_var_ptr++;
它是这样的:
取消引用首先发生,给您指示的存储位置our_var_ptr(包含63)。
然后对表达式求值,结果63仍然是63。
结果被丢弃(您对此不做任何事情)。
our_var_ptr然后在评估后增加。它正在改变指针指向的位置,而不是指针指向的位置。
它实际上与执行此操作相同:
*our_var_ptr;
our_var_ptr = our_var_ptr + 1;
说得通?马克·兰瑟姆(Mark Ransom)的答案很好地说明了这一点,只是他实际上使用了结果。
- 3 回答
- 0 关注
- 401 浏览
添加回答
举报
0/150
提交
取消