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


