C语言变量与常量

来源:互联网 发布:克里斯穆林数据 编辑:程序博客网 时间:2024/05/22 06:59

一.变量

1.1普通局部变量和全局变量的对比

1.定义同时没有初始化,则局部变量的值是随机的,而全局变量的值是默认为0的。
2.使用范围上:全局变量具有文件作用域,而局部变量只有代码块作用域。
3.生命周期上:全局变量是在程序开始之前的初始化阶段就诞生的,到整个程序结束退出的时候才死亡;而局部变量在进入局部变量所在的代码块时诞生,在该代码块退出的时候死亡。
4.变量分配位置:全局变量分配在数据段上,而局部变量分配在栈上。

基本概念:
作用域:起作用的区域,也就是可以工作的范围。
代码块:所谓代码块,就是用{ }扩起来的一段代码。
数据段:数据段存的是数,像全局变量就存在数据段。(注意:全局变量才算是程序的数据,局部变量不算程序的数据,只能算是函数的数据)
代码段:存的是程序代码,一般是只读的。
栈(stack):先进后出。C语言中的局部变量存在栈中。

注意:以下代码编译会出错未定义i,i是局部变量,工作范围是代码块(范围为{ })。

for(){    int i = 1;}printf("i:%d\n",i);

1.2静态局部变量和全局变量

1.静态局部变量和普通局部变量不同。静态局部变量也是定义在函数内部,静态局部变量定义时前面加上static关键字来标识,静态局部变量所在的函数在调用多次时,只有第一次才经历变量定义和初始化,以后多次在调用时不再定义和初始化,而是维系之前上一次调用时执行后这个变量的值。本次接着来使用。

2.静态局部变量在第一次函数被调用时创造并初始化,但在函数退出时它并不死亡,而是保持其值等待函数下一次被调用。下次调用时不再重新创造和初始化该变量,而是直接用上一次留下的值为基础来进行操作。

3.静态局部变量的这种特性,和全局变量非常类似。它们的相同点是都创造和初始化一次,以后调用时值保持上次的不变。不同点在于作用域不同。

1.3register局部变量

寄存器局部变量,和普通局部变量差不多。C语言中最快的变量,C语言承诺register变量是放在寄存器中的,普通局部变量放在内存中的。

1.4全局变量

全局变量的定义和初始化是在main函数运行之前发生的

1.局部变量能不能跨文件使用?
不能,因为局部变量属于代码块作用域。他的作用域只有他定义的那个函数内部实现。
2.静态局部变量能不能跨文件使用?
不能。因为本质还是局部变量

讨论跨文件使用问题,只用讨论全局变量和函数就可以了。

1.4.1静态全局变量(解决跨文件引用变量问题)

静态全局变量就是用来解决重名问题的。静态全局变量定义时在定义前加static关键字,告诉编译器这个变量只在当前本文件内使用,在别的文件中绝对不允许使用。

1.4.2跨文件引用全局变量

函数和全局变量在C语言中可以跨文件使用,也就是说他们的连接范围是全局的,具有文件连接属性。

二.常量

程序运行过程中不会改变的量。常量的值在运行之前初始化的时候给定一次,以后都不会变了,以后一直是这个值。

2.1#define定义的常量

2.2const关键字

const和指针结合,共有四种形式
const int *p;
p是一个指针,指针指向一个int型整数,p指向的是个常量
int const *p;
p是一个指针,指针指向一个int型整数,p指向的是个常量
int *const p;
p是一个指针,指针指向一个int型整数,p本身是常量,p所指向的是个变量
int *const *p;
p是一个指针,指针指向一个int型整数,p本身是常量,p所指向的是个常量

结论和记忆方法:
1.const在*前面,表示const作用于p所指向的量。所以这时候p所指向的是个常量
2.const在*后面,表示p本身是个常量,但是p所指向的不一定是常量

const型指针有什么用?
char *strcpy(char *dst,const char *src);
字符串处理函数strcpy,它的函数功能是把 src指向的字符串,拷贝到dst中。

2.3枚举常量

枚举常量是宏定义的一种替代品,在某些情况下会比宏定义好用。

原创粉丝点击