C 存储类浅谈
C语言内变量的存储有4种,其中最常见的为Auto类型,
您可能很疑惑,我从来都没有见过Auto这样的一个关键词,为什么你说它是最常见的呢?
auto,顾名思义,就是自动的变量存储类型,它可以被省略,就像我们平时使用int a;其实它等效于auto int a;
但是,请您一定要分得清,auto只能被用于修饰局部变量。
与之相类似的还有static类型,static代表着创新的变量不会因为子函数被调用结束而销毁。
例如:
#include <stdio.h> static int a=1; int addb() { static int b=1; b++; return b; } int addc() { int c=1; c++; return c; } int main() { int b1,c1; a++; a++; b1=addb(); b1=addb(); c1=addc(); c1=addc(); printf("A的值为%d\nB的值为%d\nC的值为%d",a,b1,c1); return 0; }
您认为这个程序运行的结果会是什么呢?
A的值为3 B的值为3 C的值为2
为什么会这样呢?请您自己思考一下。
我们都知道电脑中有CPU(中央处理器,Center Processing Unit)内存(RAM,Random Access Memory),您可能听过不止一遍的,程序是在内存中运行的,但是众所周知CPU是电脑中负责计算的大脑,倘若我们能让程序尽可能多的部分被放到CPU中存储,是否程序的运行会非常快速?
理论上的的确确是这样的,但是由于目前技术的限制,CPU中并不能放置太多的信息,这里接受register这样一样存储类型,它可以把变量放置在CPU的寄存器中。
#include <stdio.h> #include <conio.h> int main() { register int i = 0; // 寄存器变量 double sign = 1.0, res = 0, ad = 1.0; for(i=1; i<=1000000000; i++) { res += ad; sign=-sign; ad=sign/(2*i+1); } res *= 4; printf("pi is %f", res); getch(); return 0; } //程序来源https://blog.csdn.net/stl1634614466/article/details/64437030 //MyFpga尊重作者知识产权,开源但不忘始终。
您比较一下以下使用auto类型存储变量i时程序运行的速度
#include <stdio.h> #include <conio.h> int main() { int i = 0; // 寄存器变量 double sign = 1.0, res = 0, ad = 1.0; for(i=1; i<=1000000000; i++) { res += ad; sign=-sign; ad=sign/(2*i+1); } res *= 4; printf("pi is %f", res); getch(); return 0; }
可以很明显的看出,使用register类型时,程序速度得到了明显的增加,但是请您注意,register使得程序运行中的变量能够保存在寄存器中以获得更快的速度,但是手寄存器的限制,变量的长度应和机器字长有关。
还有最后一种存储类型,extern,这是一个非常厉害的存储类型,可以使用别的C文件中的变量或者函数。
第一个文件:a.c
#include <stdio.h> extern int a; extern int add(int num1,int num2); int main() { a=0; int b=2; printf("%d",add(a,b)); return 0; }
第二个文件:b.c
#include <stdio.h> int a; add(int num1,int num2) { return num1+num2; }
当他被运行的时候,结果会是2