为了账号安全,请及时绑定邮箱和手机立即绑定

在解除引用的指针上增加增量?

在解除引用的指针上增加增量?

C
拉丁的传说 2019-10-11 11:13:24
为了理解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)++;


查看完整回答
反对 回复 2019-10-11
?
慕容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)的答案很好地说明了这一点,只是他实际上使用了结果。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 401 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信