-
#include <stdio.h>
-
#include <stdlib.h>
-
-
struct a
-
{
-
int a;
-
int b;
-
};
-
-
typedef struct a a;
-
-
int c;
-
-
int *show()
-
{
-
return &c;
-
}
-
-
typedef int *(*fun)();
-
-
fun s()
-
{
-
return show;
-
}
-
-
int main(int argc, char *args[], char *env[])
-
{
-
a b;
-
a a;
-
int *p = NULL;
-
-
a.a = 1;
-
a.b = 2;
-
-
(p = malloc(sizeof(int)))[0] = 5;
-
*show() = 5;
-
show()[0] = 3;
-
-
*s()() = 1;
-
printf("*p = %d \n", *p);
-
printf("*show = %d \n", *show());
-
-
b = a;
-
-
printf("b.a = %d b.b = %d \n", b.a, b.b);
-
-
return 0;
-
}
从main函数开始解释:
1.进入main函数之后定义了两个结构体变量b,a。可以看出故意将b的声明写在a之前。
这是因为如果将变量a的声明写在变量b之前会让b的类型中的a认为是变量a。
2.接下来是
-
(p = malloc(sizeof(int)))[0] = 5;
根据括号的可以看出:先申请一个int的内存并赋值给p,然后使用数组操作取出数组的第一个元素给该元素
赋值为5。
那么这句的最后结果就是申请内存,内存地址赋值给p,并将p指向的内存的值设置为5.
3.调用函数show。这里的使用方法与一般的函数调用有所不同。因为show返回一个全局int变量的地址,再在函数前加上取之运算符,就变成全局变量了,然后再给全局变量赋值。
接着调用show函数,使用数组下标运算符来取变量。
4.s函数返回函数指针,所以后面就会带两个函数调用时使用的圆括号。
5.接下来就是结构体之间的赋值了,直接使用等号,没有使用memcpy来完成。这是在C99中加入的特性
阅读(2699) | 评论(0) | 转发(2) |