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

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

C专家编程 Expert C Programming,布布扣,bubuko.com

时间: 2024-10-31 00:24:42

C专家编程 Expert C Programming的相关文章

C语言学习书籍推荐《C专家编程Expert C Programming Deep C Secrets》下载

Peter Van Der Linden (作者) <C和C++经典著作 C专家编程Expert C Programming Deep C Secrets>展示了C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍.书中C的历史.语言特性.声明.数组.指针.链接.运行时.内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析.全书撷取几十个实例进行讲解,对C程序员具有非常高的实用价值.<C和C++经典著作?C专家编程Expert C Programming De

看书小记6(《C专家编程》)

typedef不常见但值得一提的用途: 1. 用typedef来定义与平台无关的类型. 比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为: typedef long double REAL; 在不支持 long double 的平台二上,改为: typedef double REAL; 在连 double 都不支持的平台三上,改为: typedef float REAL; 也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改. 标准库就

C专家编程学习 1

1.C语言的基本数据类型直接与底层硬件相对应. 2#define 是可能出现问题 1 2 3 4 5 #define a(y) a_ex(y) a(x)被扩展为 a_ex(x) #define a (y) a_ex(y) a(x)被扩展为 (y) a_ex(y)(x) #define宏的用法 1.简单宏定义 1 #define a y 将文件中的 a 全部换成 y 为了避免出现问题,要将宏展开,根据运算符的优先级判断是否是需要的运算顺序. 2.带参数的宏定义 1 2 #define a(y) a

看书小记8(《C专家编程》)

int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); 系统跳转函数 ,可以直接在函数之间跳转 (比goto 强大多了) 将上下文 ,就是cpu和内存的信息保存到env中 ,然后调用 longjmp的时候跳转到使用env中的信息 ,恢复上下文 .如果是第一回调用setjmp 它会返回 0,如果从longjmp 跳转过来的 ,那就返回 longjmp的参数 val,根据setjmp的返回值, 我们就可以决定执行可能发生错误的代码还是

看书小记5(《C专家编程》)

函数指针 1. 函数与函数指针类型要匹配: 2. 函数指针用来保存函数首地址,即可以通过该指针访问函数: 3. 函数指针可以指向一类函数,而不是一个函数,即可以重新赋值. int maxNumber(int a, int b) { return a > b? a: b; } void fileFunc(){ cout<<"fileFunc"<<endl; } void editFunc(){ cout<<"editFunc"

《C专家编程》:如何用气压计测量建筑物的高度(附3)

<C专家编程>,看完该书,这本书详细地介绍了C语言中的难点和易错点.本来后面的不打算写了,但是仔细想想,觉得应该善始善终,所以不论好坏,只要对自己有帮助就够了,就坚持写完!发现附录还有一个非常有趣的故事.在此也就以它结束吧,开拓一下我们眼界,更新我们的三观.   轻松一下--如何用气压计测量建筑物的高度 有一个很早的故事,讲的是一位物理系学生寻找新奇的方法用气压计测量一幢建筑物的高度.Alexander Calandrain The Teaching of Elementary Science

《C专家编程》数组和指针并不同--多维数组

<C专家编程>数组和指针并不同 标签(空格分隔): 程序设计论著笔记 1. 背景理解 1.1 区分定义与声明 p83 声明相当于普通声明:它所说明的并非自身,而是描述其他地方创建的对象,声明可以多次出现: 定义相当于特殊声明:它可以为对象分配内存,只能出现在一个地方. 1.2 数组和指针的访问方式 左值和右值 ???????? X = Y ; 符号X的含义是X所代表的地址,这被称为左值,左值在编译时可知,左值表示存储结果的地方. 符号Y的含义是Y所代表的地址的内容,这被称为右值,右值直到运行时

看书小记9(《C专家编程》)

哈希表简单实现,练个手 #include "stdafx.h" #include <iostream> using namespace std; #define HASHSIZE 12 typedef struct HashTable { int *elem; int count; }HashTable; int m = 0; void Print(HashTable* h) { for (int i = 0; i < h->count; i++) { cout

看书小记7(《C专家编程》)

Cache是位于CPU寄存器与内存之间的存储器,它的容量比内存小但交换速度快. Cache的工作原理 1.读取顺序 当数据从内存读入时,整行的数据(16~32字节)被装入Cache,如果程序具有良好的地址引用局部性(顺序浏览一个字符串),那么CPU以后对邻近数据的引用就可以从快速的Cache读取,而不用从缓慢的内存读取.典型情况下,主存的存取速度可能只有Cache的四分之一. CPU要读取一个数据时,首先从Cache中查找,如果找到就立即读取并送给CPU处理:如果没有找到,就用相对慢的速度从内存