千家信息网

c语言存储类里的关键字有哪些

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,本篇内容主要讲解"c语言存储类里的关键字有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"c语言存储类里的关键字有哪些"吧!-auto-(1)auto关
千家信息网最后更新 2024年12月12日c语言存储类里的关键字有哪些

本篇内容主要讲解"c语言存储类里的关键字有哪些",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"c语言存储类里的关键字有哪些"吧!

-auto-


(1)auto关键字在C语言中只有一个作用,那就是修饰局部变量。


(2)auto修饰局部变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。(既然

在栈上,说明它如果不初始化那么值就是随机的······)。


(3)平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。可见,auto的局部变量其实就是默认定义的普通的局部变量。


- static -


(1)static关键字在C语言中有2种用法,而且这两种用法彼此没有任何关联、完全是独立的。其实当年本应该多发明一个关键字,但是C语言的作者觉得关键字太多不好,于是给static增加了一种用法,导致static一个关键字竟然有两种截然不同的含义。


(2)static的第一种用法是:用来修饰局部变量,形成静态局部变量。要搞清楚静态局部变量和非静态局部变量的区别。本质区别是存储类不同(存储类不同就衍生出很多不同):非静态局部变量分配在栈上,而静态局部变量分配在数据段/bss段上, 在数据段的话,它是初始化好的,在bss段的话,一般我们没有初始化的,一般默认0,这个和全局变量不初始化一样。


#include 

int main(void)
{
static a;

printf("the a is %d\n",a);

return 0;
}


演示结果:


    the a is 0 


(3)static的第二种用法是:用来修饰全局变量,形成静态全局变量。要搞清楚静态全局变量和非静态全局变量的区别。区别是在链接属性上不同,等下面有介绍的。这里的话我举几个例子来说明:


------没用static关键字修饰:


  #include 

void test()
{
int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}

演示结果:

1 1 1 1 1 1 1 1 1 1 


-----加了static修饰:

  #include 

void test()
{
static int num = 0;
num++;
printf("%d ", num);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}

演示结果:


    1 2 3 4 5 6 7 8 9 10 

(4)小结:


  • 静态局部变量在存储类方面和全局变量一样


  • 静态局部变量在生命周期方面和全局变量一样。


  • 静态局部变量和全局变量的区别是:作用域、连接属性。静态局部变量作用域是代码块作用域(和普通局部变量是一样的)、链接属性是无连接;全局变量作用域是文件作用域(和函数是一样的)、链接属性方面是外连接。这里先简单说一下三种链接属性:


  • (1)外链接的意思就是外部链接属性,也就是说外链接可以在整个程序范围内(言下之意就是可以跨文件)进行链接,譬如普通的函数和全局变量属于外链接。


  • (2)内链接的意思就是(c文件内部)内部链接属性,也就是说这家伙可以在当前c文件内部范围内进行链接(言下之意就是不能在当前c文件外面的其他c文件中进行访问、链接)。static修饰的函数/全局变量属于内链接。


  • (3)无连接的意思就是这个符号本身不参与链接,它跟链接没关系。所有的局部变量(auto的、static的)都是无连接的。


(5)静态函数(就是使用这个static关键字修饰),想必搞stm32的读者,都有接触到(这里的话,我就不例子了);当你的程序中有很多源文件的时候(这在写stm32的时候经常遇到,而且经常要养成多文件不被重复包含的写法代码习惯),一般在stm32里面会使用这个static关键字来修饰函数,所以这个函数就只能在这个文件内使用了,不能在外部再使用这个函数了(这个函数的作用域只能在当前文件内),其实和上面讲全局变量和静态全局变量的区别类似。


- register -


(1)register关键字不常用,也只有一个作用,那就是:register修饰的变量。编译器会尽量将它分配在寄存器中。(平时分配的一般的变量都是在内存中的,其实读取内存中的数据过程是这样的:cpu+寄存器+cache+内存)。分配在寄存器中一样的用,但是读写效率会高很多。所以register修饰的变量用在那种变量被反复高频率的使用,通过改善这个变量的访问效率可以极大的提升程序运行效率时。所以register是一种极致提升程序运行效率的手段。


(2)平时写代码要被定义成register这种情况很少,一般慎用。


(3)register编译器只能承诺尽量将register修饰的变量放在寄存器中,但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限,不一定有空用。

到此,相信大家对"c语言存储类里的关键字有哪些"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0