book
4.1
int strindex(char s[], char t[])
{
int i,j,k;
for(i = 0;s[i] != '\0';i++)
{
for (j = i,k = 0;t[k] != '\0' && s[j] == t[k];j++,k++)
;
if(k > 0 && t[k] == '\0')
return i;
}
return -1;
}
4.4
- 外部变量或函数的作用域从声明它的地方开始,到其所在的(待编译的的)文件的末尾为结束。如果要在外部变量的定义之前使用该变量,或者外部变量的定义与变量的使用不在同一源文件中,则必须在相应的变量声明中强制性地使用关键字extern.
- 外部变量定义与声明
外部变量的声明英语说明变量的属性(主要是变量的类型),而那两定义除此之外还将引起存储器的分配。一个外部变量只能某个文件中定义一次,而其他文件可以通过extern声明访问它;下面给出变量定理和声明的例子:
int sp;
double val[MAXVAL];
extern int sp;
extern double val[];
4.5
- 头文件的作用
由于一些共同使用的外部变量和函数在不同文件中被使用的时候需要被重新声明,所以可以将这些需要共同使用的变量和函数的 声明 放在同一个文件中,在需要用到这些函数的文件中只要将这个文件包含进来就可以直接使用,不必再在每个文件重新声明外部变量和函数。这个包含外部变量和共同使用的函数的文件就叫做头文件,包含头文件的操作叫#include<a.h>
。一般头文件只会存放外部变量和函数的声明,定义在各个.c文件中实现,因为函数的声明只能出现一次,如果定义放在头文件中,而这个头文件又被多个文件引用,那么容易出现重复定义的问题。
4.6
- 静态变量
声明一个变量为静态变量static
的作用在于限定该变量的作用区域。如对一个外部变量声明为静态变量表示该变量只能在声明的文件中使用,在其他文件中不能使用该外部变量。对一个函数中的变量声明为静态变量表示该变量只能在该函数的范围内使用。注意:在函数中声明的静态变量和函数内部变量的区别是静态变量始终存在于内存中,下次调用时存放在里面的值是上次调用完毕后的值;而内部变量在函数开始时被分配内存,在函数结束后内存被收回,下次调用重新分配内存。
4.9
- 初始化
在不进行人为初始化的情况下,外部变量和静态变量都被初始化为0,而内部变量和寄存器变量没有定义。外部变量和静态变量的初始化必须是 常量 表达式。
4.11.2
- 宏替换
宏定义可以带参数,不过要十分注意括号的添加,如#define square(x) (x)*(x)
中的括号不可省略,否则在计算square(a+1)时会发生错误
4.11.3
- 条件包含 #ifdef
在头文件的编写中,为了防止一个头文件被重复包含在同一个.c文件中,最好使用条件包含格式。
头文件被重复包含情况:
假设 a.h 和 b.h 中有 #include “c.h”语句,而在 main.c 中出现了#include “a.h” 和#include “b.h” 那么 v.h就属于在一个.c 文件中重复引用的情况。这时候就会用到如下格式的语句:
#ifndef B_H
#define B_H
#endif