1.scanf格式符 p9
ld long
lf double
2.三字母词 p22
为了表示一些特殊的字符,在老式的机器键盘中可能没有的字符,特别约定了一种三字母词,三字母词都以??开始,如下:
??( [ ??< { ??= # ??! | ??- ~
??) ] ??> } ??/ / ??' ^
3.特殊字符 p23
/a 警告音,在我电脑上不能发音。
/v 垂直制表符
/ddd 八进制转义
/xddd 十六进制转义,注意:如果超过范围,那么结果是未定义的。(国内教科书直接告诉我们是/xdd)
4.mystery.c p25
5.char p29
char如果没有声明称signed,unsigned,那么char到底是哪一种完全由编译器决定。正如int的长度一样。(国内教科书直接是unsigned char)
6.枚举 p32
枚举的值是int值,可以赋值给其它int变量,其它int常量也可以赋值给枚举变量,并不会出现什么警告(国内教科书指出必须强转)
7.字符串常量 p34
字符串常量的存储有编译器决定,是否把不同地方出现的同一个字符串常量存储在同一个位置,字符串常量通常被标记为只读,所以如果你需要修改字符串的内容,那么不要声明为常量,例如:
char *pstr="hello world";
pstr[0]='H';
在gcc下,这样的代码能通过编译,但是运行时会发生段错误。因为试图修改字符串常量。如果你要修改字符串的内容,那么应该使用数组。如:
char pch[]="hello world";
pch[0]='H';
这也是指针和数组的另一个有区别的地方。我们知道指针和数组其实大部分地方都相同,另外有区别的地方是对于sizeof函数,以及跨文件声明。
8.指针书写规范 p36
声明如下指针
int* a;
int *a;
两种方式效果一模一样,但是由于很多初学者会将*和变量a连在一起对待,认为*a是一个指针,那就大错特错了。而前一种书写方式则简单明了。但是,当同时声明多个变量时,就不同了。如:
int* a,b,c;
有没有一种错觉:声明了三个指针a,b,c。
9.typedef和#define p38
正如在《C陷阱与缺陷》中说的那样,不要使用#define来定义数据类型,而是要正规的使用typedef。例如
#define MY_TYPE char *
MY_TYPE pa,pb;
展开后变成:char * pa,pb;
本来你想定义两个指针变量,但是这里其实只有pa是指针变量。
10.const p38
在《C专家编程》中,指出const关键字极易误导人,应该修改为readonly。以我的理解,const修饰离他近的变量。如下:
int const a;
const int a;
上面两个声明效果一样。普通类型极其简单,加上指针就有点麻烦了。如下:
int const *a; 或 const int *a;
int * const a;
int const * const a; 或 const int * const a;
第一行的声明了*a不能改变,但是指针a可以改变。
第二行声明了指针a不能改变,*a的内容可以改变。
第三行声明了指针a和*a都不能改变。
const变量的值不能修改,变量获得值有两种方法,一种是初始化,另一种就是作为函数形参,从实参中获得。
《C和指针》笔记1
最新推荐文章于 2024-05-14 11:03:10 发布