该书中一些思想还是比较有用的,但随着编译器以及规范的变化,书中有些内容已经发生了变化,以下是实践之后的一些总结。
1 - typedef int x[10] 和 define x int[10] 区别
define 定义为变量替换,而typedef为声明替换;
#define peach int;
unsigned peach i; //wrong
typedef int banana;
unsigned banana i; //wrong
声明替换用typedef
识别数组和函数指针
e.g:
int const * zero; //zero是一个指针,指向一个常量整形
char (*zero)[20]; //zero是一个指针,指向一个有20个char元素的数组
typedef void (*ptr_to_func)(int); //ptr_to_func是新类型名,这种类型是一个函数指针,指向接收一个int参数,并返回void的函数
char* const * (*zero)(); //zero是一个函数指针,该函数无参数,并返回一个指针,返回的指针指向一个常量指针
char* (*zero[10])(int **p); //zero是一个数组,元素是函数指针,其指向的函数授受一个二维指针,并返回一个指向char的指针
void (*signal(int sig, void (*func)(int)))(int); //signal是一个函数,该函数接收一个int,一个函数指针,并返回一个函数指针
2- signal , longjmp , setjmp
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void handler(int s) {
if(s==SIGSEGV) printf("now got a segmentation violation signal\n");
longjmp(buf,1);
}
int main() {
int *p = NULL;
signal(SIGSEGV,handler);
if(setjmp(buf)){
printf("back in main\n");
return 0;
} else {
printf("nothing\n");
}
*p = 0;
loop:
goto loop;
return 0;
}
3 . 数组和指针
数组a[10],则a和a [0]的地址等价;
#include <stdio.h>
int b[]={1,2};
int main() {
int a[10];
int *p = a;
printf("p %x \n",&p);
printf("&a %x\n",&a);
printf("&a[0] %x\n",&a[0]);
printf("&b %x\n",&b);
printf("&b[0] %x\n",&b[0]);
printf("%d\n",*b);
printf("%d\n",sizeof(a));
return 0;
}
结果:
p bfc4ca7c
&a bfc4ca54
&a[0] bfc4ca54
&b 804a014
&b[0] 804a014
1
40
4. 如果确定一个变量是有符号数还是无符号数?
#define ISUNSIGNED(a) (a>=0 && ~a > 0)
5.从文件中随机提取一个字符串
依次读取文件,然后与保存的字符串进行选择,则假设取到第N个,则以保存N-1个,则当前概率和为1/N,而保存的每个概率也为1/N。
6. 有趣的问题:如何用气压计量器测量建筑物的高度?
要学会聚焦,问题是测量建筑物高度,然后用到气压计量器就可以了。。。 方法很多了
C专家编程 Expert C Programming,布布扣,bubuko.com