Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232073
  • 博文数量: 37
  • 博客积分: 933
  • 博客等级: 军士长
  • 技术积分: 511
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-16 10:15
文章分类
文章存档

2012年(1)

2011年(36)

分类: C/C++

2011-06-03 15:12:28

有一整数数组:
  1. int arr[] = {6,7,8,9,10}
  2.       int *ptr = arr;
  3.       (*ptr++) = (*ptr++)+123;
  4.       printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出 ?
自己想一下看看心里想的输出结果,和答案是否一致。
 
答案是:*ptr:9 *ptr++:8
 
如果上述蓝色字体的语句换成
      (*ptr++) += 123;
      printf("*ptr:%d *ptr++:%d\n",*ptr,*ptr++);
程序的输出?
答案是:*ptr:8 *ptr++:7
 
  1. (*ptr++) = (*ptr++)+123;====>*ptr = *ptr + 123;
  2.                              ptr++;
  3.                              ptr++;
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向整数8;;;;;;
  1. (*ptr++) += 123; ====>*ptr += 123;
  2.                       ptr++;
 
这条语句执行完之后arr[]={129,7,8,9,10} ptr指向 整数7;;;;;;
 
然后printf函数还有一点小玄机。对于call convention(调用惯例)为stdcall而言,函数的压栈顺序为从右到左一次压栈,然而由call指令再将返回地址压入栈中。
因此在这里将*ptr++压入栈的同时,将指向ptr向前移动了一个位置,指向了下一个整数。
 
阅读(2595) | 评论(0) | 转发(0) |
0

上一篇:以太网相关

下一篇:Makefile~

给主人留下些什么吧!~~