C 存储类浅谈

chanra1n2019年11月02日C11900

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

请先 登录 再评论,若不是会员请先 注册