Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379382
  • 博文数量: 165
  • 博客积分: 436
  • 博客等级: 下士
  • 技术积分: 887
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-10 02:49
文章分类

全部博文(165)

文章存档

2012年(95)

2011年(70)

分类:

2011-12-01 00:18:08

  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的最终值。

阅读(551) | 评论(0) | 转发(0) |
0

上一篇:Linux系统启动过程

下一篇:Linux下更改时间

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