static 有三个作用
(1) 修饰全局变量。改变变量的作用域,只能在当前文件被调用,其他文件不能调用。
(2) 修饰函数。 改变函数的作用域,只能在当前文件被调用,其他文件不能调用。
(3) 修饰局部变量,改变变量的生命周期,直到程序结束才能释放。改变变量的生命周期,直到程序结束才能被释放(释放的是栈空间)。被static修饰的局部变量,存放在数据段(静态数据区)。
关于printf的打印到屏幕的问题
在使用printf打印数据时。‘\n’ 不仅换行,也起到刷新缓冲区的作用。
程序运行打印数据到屏幕时,会先把数据存到缓冲区。缓冲区中的数据,在遇到换行时才会刷新,或者使用手动刷新函数fflush(stdout) 来刷新缓冲区数据。
for(i = 0; i < 5; i++)
{
printf("%d\n", i);
sleep(1);
}
上述代码输出结果是,每隔1秒打印数字,一行打印一个数字 从 0 到 4,
然后我们再看下面的这一串代码。
for(i = 0; i < 5; i++)
{
printf("%d ", i);
//fflush(stdout);
sleep(1);
}
上述代码预想的输出结果应该是,在一行每隔1秒打印一个数字 ,0到4
实际上,它的运行结果是 0到4 这 5个数字同时打印在屏幕上。 这是因为5个数字存放到缓冲区后,直到程序结束才刷新出来。解决方法是在sleep()函数之前加个fflush()函数,来手动刷新缓冲区。
指针
1.所有类型的指针的长度都是4个字节,
int *a;
char *b;
long *c;
float *d;
double *e;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(c));
printf("%d\n", sizeof(d));
printf("%d\n", sizeof(e));
/***运行结果***/
4
4
4
4
4
2. * 有两个含义:
定义时:表示后面的变量是一个指针
使用时:表示取值。
3. 指针的赋值
int a = 0;
int *p;
p = &a;
int *pa;
pa = p;
4. malloc申请空间
malloc()函数可以向操作系统申请空间,申请的空间是连续的。函数返回申请好的这段空间的首地址,申请的是堆空间。
需要注意的是使用malloc()函数必须在开头加头文件 stdlib.h,并且在最后使用free()函数手动释放申请的空间。
int main()
{
char *fp;
fp = (char *)malloc(sizeof(char)*20);
if(NULL = fp)
{
printf("malloc falue!\n");
}
strcpy(fp,"helloworld");
printf("%s\n", fp);
free(fp);
return 0;
}
再者,如果在空间不够的情况下使用malloc()会申请失败,不妨用一个 if 语句来判断一下,告知成功与否。
5. 指针的一个经典例题——交换两个数
void swap1(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
}
void swap2(int x, int y)
{
int *tmp;
tmp = x;
x = y;
y = tmp;
}
void swap3(int *x, int *y)
{
int tmp;
tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 1;
int b = 2;
printf("a = %d, b = %d\n", a, b);
swap1(a, b);
printf("a = %d, b = %d\n", a, b);
swap2(&a, &b);
printf("a = %d, b = %d\n", a, b);
swap3(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
/***运行结果***/
a = 1, b = 2
a = 2, b = 1