一、标识符 作用域 和 可见性问题
作用域:作用的范围
局部变量 --- 一定在某一个{} 范围内
全局变量 --- 不在任何一个{} 范围内
可见性:
程序运行到某个点,哪些标识符可见
标识符的可见性的规则:
1.先定义,后使用
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响
4.如果是不同的作用域,
但是作用域之间存在嵌套关系,
则,
内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。
(就近原则)
时间上去区分:
动态变量(局部变量-空间是开辟在栈上的--自动申请自动释放) (声明周期):
从定义的语句开始,到所在的作用域范围结束
eg:
栈上的 局部变量
静态变量 (全局变量)
从程序一开始运行,就存在,
直到程序结束时,销毁
eg:
全局变量
static 局部变量
注意:
全局变量(静态变量)
1.不能用变量进行初始化,只能常量初始化
2.静态区的变量
只会被初始化一次
3.值具有 继承性
auto int a; //这个是一个自动变量 --- 栈上开辟的变量
static int a; //静态区
//修饰的是 局部变量
register int a; //CPU 寄存器
//建议性
考点:
不能 & (取地址)
register int i;
for( i = 0; i < 100000000; ++i)
{
}
extern int a; //扩展 延伸
//表示 此时这个a 不是在当前文件中定义的 ,
//如果要用,请到别的文件中寻找
//多文件编程
//一般使用在多文件编程中:
//如果想在当前文件使用别的文件中的 全局变量 ,
//此时,可以使用
//extern int a; //做声明
//相当于,把别的文件中的变量作用域扩展到当前文件
//全局变量前面
static 修饰局部变量
//将局部变量 存储在了 全局区(静态区)
//将局部变量的生命周期延长
static 修饰全局变量
//表示 将全局变量 的作用域限定到本文件中
//别的文件中不能extern了
extern 可以放在函数声明中 --函数声明
//表示的意思 --将函数作用域扩展到当前文件
static 加在函数前面
// 此时效果与修饰全局变量效果一样
// 将函数作用域限定到本文件中
二、指针变量
语法:
基类型* 指针变量名;
基类型 --- 数据类型
//基本数据类型
//数组类型
//基类型 表示 指针变量 指向的目标的 数据类型
* --- 表示此时定义的变量 是一个指针类型的变量
指针变量名 --- 标识符命名规则 + 见名知意
int * p; //表示定义了一个指针类型的变量
int a = 10;
float b = 1.23;
int *p = &a; //指针变量 p 指向 了 int型变量a
p变量的数据类型 int * //指针类型
&b --地址值 ---类型?
float
b有一块内存空间 -- 放的是float类型的数据
&b ---得到了一块 存放着 float类型数据的 空间的地址
float *p1 = &b;'
float b = 10;
&b --- > 地址值的类型 -->float *
b的数据类型--决定了这块空间放的的数据类型
&b --获得了 这块空间 的地址编号
float * //这种类型的地址数据
float *p1 = &b;
---------------------------------------------------------
指针变量:
访问变量时:
直接访问
间接访问 通过地址访问到的
* 指针运算符
* 单目运算
运算数必须是指针类型的值(地址)
*p 过程
1.首先拿出p指针变量中的值(地址) 到内存中定位
2.从定位处开始,偏移出sizeof(基类型)大小的一块空间
3.把这块空间当做一个 基类型的 变量来看