Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39777
  • 博文数量: 19
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-29 20:13
文章分类
文章存档

2013年(12)

2012年(7)

我的朋友

分类: C/C++

2013-03-11 11:20:50

原文地址:无聊C 作者:file3

点击(此处)折叠或打开

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

  3. struct a
  4. {
  5.     int a;
  6.     int b;
  7. };

  8. typedef struct a a;

  9. int c;

  10. int *show()
  11. {
  12.   return &c;
  13. }

  14. typedef int *(*fun)();

  15. fun s()
  16. {
  17.     return show;
  18. }

  19. int main(int argc, char *args[], char *env[])
  20. {
  21.     a b;
  22.     a a;
  23.     int *p = NULL;
  24.  
  25.     a.a = 1;
  26.     a.b = 2;

  27.     (p = malloc(sizeof(int)))[0] = 5;
  28.     *show() = 5;
  29.     show()[0] = 3;

  30.     *s()() = 1;
  31.     printf("*p = %d \n", *p);
  32.     printf("*show = %d \n", *show());

  33.     b = a;

  34.     printf("b.a = %d b.b = %d \n", b.a, b.b);

  35.     return 0;
  36. }

从main函数开始解释:
1.进入main函数之后定义了两个结构体变量b,a。可以看出故意将b的声明写在a之前。
  这是因为如果将变量a的声明写在变量b之前会让b的类型中的a认为是变量a。
2.接下来是

点击(此处)折叠或打开

  1. (p = malloc(sizeof(int)))[0] = 5;
根据括号的可以看出:先申请一个int的内存并赋值给p,然后使用数组操作取出数组的第一个元素给该元素
赋值为5。

那么这句的最后结果就是申请内存,内存地址赋值给p,并将p指向的内存的值设置为5.

3.调用函数show。这里的使用方法与一般的函数调用有所不同。因为show返回一个全局int变量的地址,再在函数前加上取之运算符,就变成全局变量了,然后再给全局变量赋值。

接着调用show函数,使用数组下标运算符来取变量。

4.s函数返回函数指针,所以后面就会带两个函数调用时使用的圆括号。

5.接下来就是结构体之间的赋值了,直接使用等号,没有使用memcpy来完成。这是在C99中加入的特性



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