C语言杂记

来源:互联网 发布:张碧晨红玫瑰网络链接 编辑:程序博客网 时间:2024/05/17 01:40

一、C语言自带的宏定义

1.__LINE__:表示正在编译文件的行号
2.__FILE__:表示正在编译文件的名字
3.__DATE__:表示编译时刻的日期字符串
4.__TIME__:表示编译时刻的时间字符串
5.__STDC__:判断该文件是不是定义成标准C程序
6.sizeof在编译是生效

二、typedef定义

1.typedef int sss[10]//定义一个新的关键字,sss,它定义的一个变量为int[10]类型的。
2.typedef int (*FUN)(int ,int );//第一个FUN类型,FUN,它定义的一个变量为一个函数指针,这个函数返回的是int类型,参数为两个int类型。

三、定义变量的格式

a) 一个整型数
b) 一个指向整型数的指针
c) 一个指向指针的的指针,它指向的指针是指向一个整型数
d) 一个有10个整型数的数组
e) 一个有10个指针的数组,该指针是指向一个整型数的
f) 一个指向有10个整型数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案是:
a) int a;  
b) int *a;
c) int **a;
d) int a[10];
e) int *a[10];
f) int (*a)[10];
g) int (*a)(int);
h) int (*a[10])(int);

四、语句杂记

1.continue和break如果工作在嵌套循环中,永远只对内层循环起作用。在for语句中,continue的作用是跳过其他语句,直接执行(for(;;i++))i++ 操作。
如果continue在switch中,没有作用;如果在循环内的switch中,作用于循环。

2.常量表达式:编译时求值的表达式,它不能是任何变量。

3,switch中的case标签,并不是把代码划分为几个部分,只是确定语句列表的进入点。

5.(*(void(*u) ())0)();这是《C Traps and Pitfalls》这本经典的书中的一个例子。

下面我们就来分析分析:
第一步:void(*) (),可以明白这是一个函数指针类型。这个函数没有参数,没有返回值。
第二步:(void(*) ())0,这是将0 强制转换为函数指针类型,0 是一个地址,也就是说一
个函数存在首地址为0 的一段区域内。
第三步:(*(void(*) ())0),这是取0 地址开始的一段内存里面的内容,其内容就是保存
在首地址为0 的一段区域内的函数。
第四步:(*(void(*) ())0)(),这是函数调用。
好像还是很简单是吧,上面的例子再改写改写:
(*(char**(*) (char **,char **))0) ( char **,char **);

                                                                                                                                                                                                                                                               待续。。。