Chinaunix首页 | 论坛 | 博客
  • 博客访问: 828745
  • 博文数量: 157
  • 博客积分: 542
  • 博客等级: 中士
  • 技术积分: 1696
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-21 20:21
文章分类
文章存档

2017年(1)

2016年(2)

2015年(6)

2014年(42)

2013年(77)

2012年(19)

2011年(10)

分类: C/C++

2011-11-29 18:24:52

  1. #include <stdio.h>
  2. #include <memory.h>
  3. #include <stdlib.h>

  4. char * static_Value (char *v, char x)
  5. {
  6.   if (!v)
  7.     return NULL;
  8.     
  9.   v[0] = x;
  10.   
  11.   return v;
  12. }

  13. int main (void)
  14. {
  15.   int i;
  16.   char x;
  17.   char y;
  18.   char *values;
  19.   
  20.   values = (char *)malloc(10);
  21.   memset (values, 0, 10);
  22.   
  23.   i = 0;
  24.   printf ("\n %d - %d", i++, i++);
  25.   
  26.   x = 'a';
  27.   y = 'b';
  28.   
  29.   printf ("\n %s - %s", static_Value(values, x), static_Value(values, y));
  30.   printf ("\n %s - %s", static_Value(values, y), static_Value(values, x));
  31.   
  32.   if (values)
  33.     free(values);
  34.     
  35.   return 0;
  36. }

运行结果:(cygwin)

这里的运行结果告诉了我们printf的特点:

printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的。

所以第一个printf就可以看出先把参数依次入栈,最后在处理的时候是反过来的,即真正的执行顺序是从右到左的。此时先执行第二个i++;打印的值为0,然后i自增变为1,所以第一个i就自然的成为了1.打印出1 和 0。

相比较第一个,我们可以看到第一个是对值进行操作。第二个是则是对指针进行操作。根据printf的特点,当从右向左执行过程中,先执行static_Value(values, y) 此时values[0] = y; 然后执行 static_Value(values, x)此时values[0] = x; 这时因为并不是对值进行操作,而是指针,而且将要打印的指针的地址是一样的,都是values申请的内存地址,所以此时 打印出来的就都是最后一个执行的x了,因为最后一个执行的时候对这个地址空间进行的赋值是values的最终值。

阅读(3356) | 评论(4) | 转发(1) |
给主人留下些什么吧!~~

jonas_mao2011-12-01 23:48:45

flagcugb: 赞~~~~~~.....
谢谢

jonas_mao2011-12-01 23:48:11

☆彼岸★花开: 学习了!.....
  共同学习

☆彼岸★花开2011-12-01 00:19:09

学习了!

flagcugb2011-11-30 20:42:54

赞~~~~~~