首页 > 代码库 > C专家编程 Expert C Programming

C专家编程 Expert C Programming

该书中一些思想还是比较有用的,但随着编译器以及规范的变化,书中有些内容已经发生了变化,以下是实践之后的一些总结。

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. 有趣的问题:如何用气压计量器测量建筑物的高度? 

要学会聚焦,问题是测量建筑物高度,然后用到气压计量器就可以了。。。  方法很多了