C05(变量属性)

1. C语言的变量属性

  • C语言中的变量可以有自己的属性
  • 在定义变量的时候可以加上“属性”关键字
  • 属性关键字,指明变量的特有意义
//语法
property type var_name

//示例
int main()
{
	auto char a;
	register int b;
	static long c;
	extern double d;
	
	return 0;
}

2. auto关键字

  • auto是C语言中局部变量的默认属性
  • auto表明将被修饰的变量,存储于栈上
  • 编译器默认所有的局部变量都是auto的
void f(){
	auto int i;   //显示指定i为auto属性
	int j;        //局部变量默认属性是auto的
}

3. register关键字

  • register关键字指明将局部变量存储于寄存器中,不可以是全局变量,因为全局变量在程序运行期间一直存在,由于寄存器数量有限,不可能让某个变量一直占着寄存器
  • register只是请求将局部变量存储于寄存器中,但是不一定能成功(毕竟寄存器很少)
  • register变量必须是CPU寄存器能够接受的值
  • 不能用 & 运算符获取register变量的地址
#include <stdio.h>

register int g_val;   //error

int main(){
	register char var
	printf("0x%08X", &var);    //error
	return 0;
}

4. static 关键字

  • static关键字指明变量的“静态属性”

  • static 关键字修饰的局部变量存储在程序静态区,static声明的全局变量,作用域仅在声明的文件中,static修饰的函数,作用域仅在声明的文件

# include <stdio.h>

int g_val;            //全局变量,可以在程序的任意位置访问
static int g_sval;   //静态全局变量,只在当前文件中可以访问
int main(){
	int var;           // 局部变量,在栈上分配空间
	static int svar;  // 静态局部变量,在静态数据区分配空间
	return 0;
}

5. 代码分析

5.1 auto ,register,static关键字

代码示例:

#include <stdio.h>

int f1()
{
    int r = 0;
    
    r++;
    
    return r;
}

int f2()
{
    static int r = 0;
    
    r++;
    
    return r;
}


int main()
{
    auto int i = 0;       // 显示声明 auto 属性,i 为栈变量
    static int k = 0;     // 局部变量 k 的存储区位于静态区,作用域位于 main 中
    register int j = 0;   // 向编译器申请将 j 存储于寄存器中

    printf("%p\n", &i);
    printf("%p\n", &k);
  //  printf("%p\n", &j);   // error
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f1());
    }
    
    for(i=0; i<5; i++)
    {
        printf("%d\n", f2());
    }
    
    return 0;
}

运行结果:

在这里插入图片描述

5.2 extern关键字

  • extern用于声明外部定义的函数或者变量
    • extern变量在文件的其他地方分配空间
    • extern函数在文件的其他地方定义

代码示例1:

#include<stdio.h>

extern int i;

int main()
{
	printf("i: %d\n", i);  // 打印结果 99

	return 0;
}

int i = 99;

示例代码2:

//main.c
#include <stdio.h>

extern int getI();

int main()
{
    printf("%d\n", getI());
       
    return 0;
}
//other.c
static int g_i;

int getI()
{
    return g_i;
}

编译:gcc main.c other.c,运行:./a.out,运行结果为0

  • extern “告诉”编译器用C方式编译源代码(比如在C++语言中写C语言代码)

    扫描二维码关注公众号,回复: 10662527 查看本文章

    如下图所示:

在这里插入图片描述

6. 总结

  • auto变量存储在栈中,局部变量的默认属性
  • static变量存储在程序的静态区,也就是数据区
  • register请求变量存储在CPU 寄存器中(不一定能请求成功)
  • extern变量在文件的其他地方分配存储空间
  • extern能够指示编译器按照标准C的方式来编译代码
发布了123 篇原创文章 · 获赞 31 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105119283
今日推荐