int main()
{
auto int i = 0;
register int j = 0;
static int k = 0;
return 0;
}
这三个变量有什么区别?
auto变量存储在程序的栈中,默认属性
static变量存储在程序静态区中
register变量请求存储于CPU寄存器中
用法在现在的C编译器中 auto是变量的默认属性来 auto代表变量在栈上分配空间也就是局部变量
static主要用在需要保存前一次计算结构的场合
register是将变量请求放在寄存器中 在一些需要高处理速度的场合可以使用但是register只是请求寄存器变量,但不一定请求成功
现在我们深入讨论一下 大家觉得下面的函数正确吗?为什么?
int* func1()
{
register int i = 0;
return &i;
}
int* func2()
{
static int i = 0;
return &i;
}
int* func3()
{
auto int i = 0;
return &i;
}
只有func2是正确,因为我们看存储位置,static的变量存储在程序静态区,静态区是进程中一个特殊的存储区,我们在后面的专题答疑中会讲解。 static变量在程序结束后才会释放,所以即使是局部的,也可以返回地址。
我们通常说的地址都是内存地址,所以寄存器变量不能用&符号取地址,我们没有办法在C语言中直接得到寄存器。所以func1不对,编译不过。
func3返回了一个auto局部变量的地址,可以编译通过,但是程序可能运行错误,因为auto变量在函数返回后就被释放,因此原来的地址将不再代表这个变量。
static int i = 0;
static int f()
{
static int i = 0;
return i;
}
这里一共出现了3个static,它们代表的含义有区别吗?
static关键字指明变量的“静态”属性;
static关键同时具有“作用域限定符”的意义
static修饰的局部变量存储在程序静态区
static的另一个意义是文件作用域标示符:static修饰的全局变量作用域只是声明的文件中
static修饰的函数作用域只是声明的文件中
因此第一个 static int i = 0;是说这个全局变量是能在定义的文件使用,外部不能用extern来使用了
第二个 static int f()也是说这个函数只能在定义的文件中调用,即f()将为这个源文件所私有,其他文件不能使用的
第三个指的是静态局部变量,其作用域是定义的函数中,生命周期是程序运行期,静态局部变量,虽然生命周期是程序运行期,但是,可见性是在函数内
const int* p;
int const* p;
int* const p;
const int* const p;
这个知识点常考,大家觉得这几个p有没有区别?
很多初学者对这个问题都很头疼,其实我们只要记住一个口诀,就全部清楚了。
口诀:左数右指
当const出现在*号左边时指针指向的数据为常量
当const出现在*后右边时指针本身为常l量