有很多已经以写程序和其注释的方式记录在我的workspace中了。现在记录一下比较零碎和易忘的东西:
1. 在C语言中,函数的返回值为数组是不合法的。
2. 多维数组的声明中,只有第一维(即行数)是可以忽略的如:
int array[][3];
3. 使用strcpy,strncpy,strcat,strncat时,注意两点:(P330)
1)输出参数是否有足够的空间容纳所创建的整个字符串。
2)所创建的字符串是否以'/0'结束。
4. typedef语句不能分配任何内存空间,因此需要变量声明来为结构数据对象分配空间。(P407)
5. 结构体的赋值问题:简单的通过将一个结构赋值给另一个结构,就可以得到该结构值的一个新的副本。(P409)
6. 如果函数名的存储类别为extern,那么就是意味着这些函数是由连接器所用。(P483)
附:全局变量,static和register等的专题需要再写。
7. 请大家记住,对于所有的预处理程序指令,条件编译指令#是该行的第一个非空白字符。#undef 可以是预处理程序取消某个特殊名称的定义。(P490)
8. 展开2行或者多行宏时,应该在行尾加上反斜扛'/'。
9.如果向printf()函数传递一个没有包含‘/0’的字符数组,那么printf函数首先会将每个数组元素的内容解释为一个字符并显示出来,然后printf会继续以字符形式显示位于该数组参量后面的内存位置中的内容,直到遇到了空字符,或者试图访问一个并不是指派给本程序的内存单元,从而导致运行时错误为止。在自己编写字符串结构函数时,必须要确保在每个字符串的末尾插入了一个空字符。对于字符串常量来说,空字符是自动添加的。
10. 大家已经习惯使用赋值运算符=向变量中赋值数据。尽管确实可以在字符串变量的声明中使用赋值符号进行初始化,但这种方式的唯一使用情况是该运算符是将右操作数的字符串复制到作为做操作数的变量中。前面已经讲过,不带下标的数组名表示的其实时数组初始元素的地址,并且这个地址是常量,不能通过赋值操作来更改。因此下面的代码段会导致编译器产生一条错误消息,比如“Invalid target of assigment”:
char one_str[20];
one_str="Test string"; /*does not work*/
有两种做法解决:
1. char one_str="Test string/0/0/0/0/0/0/0/0/0";
2. char one_str[20];
strcpy(one_str,"Test string");
另外:P468-P469,等页面需要记录一些常用函数的函数原型。