您的位置:首页 > 编程语言 > C语言/C++

C和指针读书笔记(前四章)

2017-01-19 15:54 246 查看
第一章

1.#If 0注释

当要把一段程序完全从程序中注释掉的时候,在程序段的收尾使用/*和*/是没有用的,因为假如中间存在/**/,注释不支持嵌套,所以最好的办法是使用。

#if 0

   Statements

#endif

这样就会无条件的注释掉这段程序。

2.const的作用:

第一,限定一个只读变量(不是常量)。如const double PI = 3.14
第二,限定函数参数,如,

void function(const char *p) //函数只能读取不能改变p的值

3.传值调用和传址调用

传值是吧实参的值“拷贝”给形参,运算中是对形参进行操作,实参的值在运算中不会发生变化
传址是把实参的地址传给形参,运算中是对实参进行操作,会改变实参的值

4.字符知识小整形数而已,用一个整型变量容纳字符值并不会引起任何问题。

5.字符串操作函数strcpy拷贝,strncpy拷贝n个,,strcat查找到第一个匹配的返回指向其的指针。Sacanf函数的标量参数前需要添加字符。

 

问题:

1.将声明放在头文件中,并使用#include放在源程序里,这样做的好处就是当多个源文件需要用到声明的时候,只需要#include这个头文件就可以,这样也便于维护的。

2.依次打印十进制整数,字符串和浮点值。%d,%s,%g(自动选择输出%f或者%e指数形式,且屏蔽无意义的0)。

3.C语言不执行数组下标的有效性检查是因为C 的数组根本就是一个指针的语法 trick 而已。a[3] 就是 *(a+3),而此时 a 就是一个地址,当然没有所谓边界限制。

4.while(gets(input)!=NULL){},这个语句会出现什么问题。Input如果不足够大,会溢出。

 

 

第二章

1.转意字符\,\?表示连续多个问号,\”表示一个字符串常量内部的双引号,\’表示字符常量

\b 退格键 \n换行
\r回车

2.所有的注释在你预处理阶段被拿到,取而代之的是一个空格。

3.强调代码风格

 

问题:

1.用printf打印”Blunder??!??”

程序如下:

printf("\"Blunder?\?!??\"\n");

2.\40,\x40,\0123,\x0123的值各为多少?

\ddd 任意字符 三位八进制

\xhh 任意字符 二位十六进制

查看ascii码表,上述依次表示空格字符,@字符,\0123表示先换行再输出3,\x0123表示soh和#,但是该句无法用printf打印出来出来,猜测是这个值。分开打印\01和\23,会有一个小的笑脸和#输出。

3.int x/*bla bla*/y,等价于int x y;编译的时候会报错。

4.将多个源文件编译生成一个目标文件,采用gcc a.c b.c c.c -o tagername。

5.如果要加入某个库,在编译的时候加上-lname,这个name是库的文件名称。

6.关于多个源文件修改了其中单个文件,如何编译的做法,我的做法是gcc *.* -o target,哈哈,单个编译gcc -c a.c会生成.o文件,然后再将他们连接起来就好了。

 

第三章

1.长整形不一定就比短整型要长,只能说长整形应该至少和整形一样长,而整形至少应该和短整型一样长,是一种不小于的关系,具体编译器以及平台有关。

2.Limit.h说明了不同的整数类型的特点。

3.显示的声明变量的类型为signed
或者 unsigned,可以增加程序的可移植性。

4.命名常量的是被允许的,用const修饰。

5.枚举类型,用在结果集合很少的情况。

6.同理,long double至少要和double一样长,double至少要和float一样长。

7.指针可以实现例如tree和list这样的高级数据结构。

8.指针是内存地址的别名,指针变量是的值是另一个内存的地址。

9.C语言中字符串的概念是以NLL字节结尾的零个或者多个字符,如果你需要修改字符串,请他把存储于数组中。

10.当一个变量首先被定义为static后,再修饰为extern是无效的,extern只对第一次生命的标识符有作用,表示链接属性为external.

11.变量的存储类型决定了变量何时创建,何时销毁以及他的值保持多久(生存周期),有三个地方可以保存变量,普通内存,硬件寄存器和运行时的堆栈。

12.修改变量的存储类型并不代表修改了变量的作用于,在函数内部将变量声明为static,只会使得变量存储在静态存储区,它的值在函数反复调用后依旧是上一次的值,而不会每次都销毁重新创建在堆栈中。

13.寄存器变量,register一般由编译器决定将什么变量放到寄存器中,人为声明过多的寄存器变量,如果编译器没有内置的寄存器变量配置,会默认只选择前几个放到寄存器中。

14.如果不显示的指定静态变量的初始值,默认为0。自动变量则没有显式的初始值,即使有,这个值为“垃圾”

15.static修饰函数和代码块之外的变量的时候,改变的是链接属性,不改变存储类型和作用域,只能在源文件中访问。修饰代码块之内的变量,不改变连接属性和作用域,但是改变了存储类型,不会随着函数的销毁而销毁。

16.为了避免不同的机器对变量的长度的不同,可以在头文件中加入一个平台的宏,不同的平台typedef类型的长度,这样可以增加程序的可移植性。

 

第四章

1.C语言是没有赋值语句的,而是用一个;将一个表示编程赋值语句,例如y+3;这样的语句存在是没有任何问题的。但是y=y+3;这就是赋值语句,被;隔开的表达式。

2.Else子句从属于最靠近它的不完整的if语句,如果需要让他跳过最靠近的,需要用花括号把它们从属关系区别开来。

3.在while内部执行break语句,用于永久种植循环,在执行完break之后,执行流下一条语句应该是循环正常结束后应该执行的那条语句。Continue语句用于永久终止当前的那次循环,在执行完continue语句之后,执行流接下来就是重新测试表达式的值,决定是否循环。Break和continue语句只能对最内层的循环起作用。

4.Switch(expr)中的expr必须是整型值,case必须具有一个唯一的值。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言 指针