C中的寄存器变量跟引用变量
C中的寄存器变量和引用变量
总共有auto,static,register,extern。
---------------------------
寄存器变量 register,直接放到cpu中的变量 适合使用频繁的变量,可以提高运行速度。
只限于整形,字符型,指针型的局部变量。寄存器变量是动态变量,仅允许说明两个寄存器变量
eg:register int i;
----------------------------
引用型变量extern,某个模块文件中使用到另一个文件中的全局变量,使用extern来说明。
eg:file1.c中定义了全局变量int s,另一个file2.c中的函数fun1()需使用这个变量s
在file2.c中的fun1()对s进行外部变量说明:
fun1()
{
extern int s;
.....
}
定义时分配内存,其他文件引用时不再分配内存。
补充一下,auto已经过时,已经不再使用。static 变量就存储区域而言和全局变量是一样的,只不过编译时只能生成内部符号,外部模块(其他的.c文件)链接不到。register 只是建议编译器把这个局部变量放到寄存器中而不要放到栈中,但最终是否这样做是由编译器决定的,声明为register的变量不一定会放到寄存器中,而没有声明为register的变量也有可能被放到寄存器中。extern 是向编译器说明,有这样一个这样类型的变量存在,至于是在哪儿定义的让链接器去找吧。
在不写的一般情况下都是auto吧?
自动变量。
在不写的一般情况下都是auto吧?自动变量。
我的理解,函数体内定义的变量,除了static的,其他都是auto的,其实就是栈上的局部变量。auto是历史遗留产物,不要再关心这个了。
再补充一点函数体内定义的static变量和函数外定义的static变量本质是一样的,只不过函数体内的static变量的名字在函数体外不能引用罢了。
总共有auto,static,register,extern。
---------------------------
寄存器变量 register,直接放到cpu中的变量 适合使用频繁的变量,可以提高运行速度。
只限于整形,字符型,指针型的局部变量。寄存器变量是动态变量,仅允许说明两个寄存器变量
eg:register int i;
----------------------------
引用型变量extern,某个模块文件中使用到另一个文件中的全局变量,使用extern来说明。
eg:file1.c中定义了全局变量int s,另一个file2.c中的函数fun1()需使用这个变量s
在file2.c中的fun1()对s进行外部变量说明:
fun1()
{
extern int s;
.....
}
定义时分配内存,其他文件引用时不再分配内存。
1 楼
agurick
2009-03-25
补充一下,auto已经过时,已经不再使用。
static 变量就存储区域而言和全局变量是一样的,只不过编译时只能生成内部符号,外部模块(其他的.c文件)链接不到。
register 只是建议编译器把这个局部变量放到寄存器中而不要放到栈中,但最终是否这样做是由编译器决定的,声明为register的变量不一定会放到寄存器中,而没有声明为register的变量也有可能被放到寄存器中。
extern 是向编译器说明,有这样一个这样类型的变量存在,至于是在哪儿定义的让链接器去找吧。
static 变量就存储区域而言和全局变量是一样的,只不过编译时只能生成内部符号,外部模块(其他的.c文件)链接不到。
register 只是建议编译器把这个局部变量放到寄存器中而不要放到栈中,但最终是否这样做是由编译器决定的,声明为register的变量不一定会放到寄存器中,而没有声明为register的变量也有可能被放到寄存器中。
extern 是向编译器说明,有这样一个这样类型的变量存在,至于是在哪儿定义的让链接器去找吧。
2 楼
laowood
2009-03-26
agurick 写道
补充一下,auto已经过时,已经不再使用。static 变量就存储区域而言和全局变量是一样的,只不过编译时只能生成内部符号,外部模块(其他的.c文件)链接不到。register 只是建议编译器把这个局部变量放到寄存器中而不要放到栈中,但最终是否这样做是由编译器决定的,声明为register的变量不一定会放到寄存器中,而没有声明为register的变量也有可能被放到寄存器中。extern 是向编译器说明,有这样一个这样类型的变量存在,至于是在哪儿定义的让链接器去找吧。
在不写的一般情况下都是auto吧?
自动变量。
3 楼
agurick
2009-03-26
laowood 写道
在不写的一般情况下都是auto吧?自动变量。
我的理解,函数体内定义的变量,除了static的,其他都是auto的,其实就是栈上的局部变量。auto是历史遗留产物,不要再关心这个了。
再补充一点函数体内定义的static变量和函数外定义的static变量本质是一样的,只不过函数体内的static变量的名字在函数体外不能引用罢了。