C语言基础 | 小白向 |变量常量存储类

本文讲解C语言中的宏定义、类型转换、变量存储类型及作用范围等关键知识点,并通过实例说明static、extern等关键字的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为大一程序设计C语言期末复习自己搜刮到的遗漏点易错点等

  1. define的用法

C语言中的#define是预处理指令,用于定义宏常量。它的语法是:

#define 宏名 宏值

在程序中出现宏名时,预处理器会把它替换为宏值。例如:

#define PI 3.14
double area=PI;

编译时,预处理器会把上面的代码替换为:

double area=3.14;

宏常量的优点是替换简单,速度快,不需要分配存储空间,但不能用于类型检查和作为函数参数使用。

  1. 字符常量

  1. 类型转换

int a=10, b=4;
double c, d;
c=(double)a/b;
d=(double)(a/b);
printf("%.2f %.2f", c, d);
//区别在于是先运算再转换,还是先转换再运算
int a=10, b=4;
double c=0.5, d, e;
d=a/b/c;
e=(double)a/b/c;
printf("%.2f %.2f", d, e);
//除法的运算顺序是从左到右
//注意类型转换后面有没有括号

  1. 运算顺序

  1. 存储类型

在C语言中,变量是对程序中数据所占内存空间的一种抽象定义,定义变量时,用户定义变量的名、变量的类型,这些都是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定变量在内存中的位置。

在计算机中,保存变量当前值的存储单元有两类,一类是内存,另一类是CPU的寄存器。变量的存储类型关系到变量的存储位置,C语言中定义了4种存储属性,即自动变量(auto)、外部变量(extern)、静态变量(static)和寄存器变量(register),它关系到变量在内存中的存放位置,由此决定了变量的保留时间和变量的作用范围。

变量的保留时间又称为生存期,从时间角度,可将变量分为静态存储动态存储两种情况:
(1)静态存储是指变量存储在内存的静态存储区,在编译时就分配了存储空间,在整个程序的运行期间,该变量占有固定的存储单元,程序结束后,这部分空间才释放,变量的值在整个程序中始终存在。
(2)动态存储是指变量存储在内存的动态存储区,在程序的运行过程中,只有当变量所在的函数被调用时,编译系统才临时为该变量分配一段内存单元,函数调用结束,该变量空间释放,变量的值只在函数调用期存在。

变量的作用范围又称为作用域,从空间角度,可以将变量分为全局变量局部变量
(1)局部变量是在一个函数或复合语句内定义的变量,它仅在函数或复合语句内有效,编译时,编译系统不为局部变量分配内存单元,而是在程序运行过程中,当局部变量所在的函数被调用时,编译系统根据需要,临时分配内存,调用结束,空间释放。
(2)全局变量是在函数之外定义的变量,其作用范围为从定义处开始到本文件结束,编译时,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。

对变量的理解分为两个维度,一个时间维度,一个空间维度

时间上是关注什么时候占用空间,什么时候释放

空间上是作用范围,什么地方能用,什么地方不能用

关键字extern

外部变量,即全局变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。

如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件末尾。如果在定义点之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量进行“外部变量声明”,表示该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。

通常的,用extern声明外部变量,扩展程序文件中的作用域。

比如我们在另外一个文件里声明了一个变量,想在另一文件里用,同时他们是同一个程序的文件,那么就需要用extern声明一次再进行使用。

并且使用extern声明变量的时候只是做引用,不会再产生空间。

关键字static

有时候希望函数中的局部变量的值不要销毁,保留原来的值,则使用static声明全局变量

声明后变量处于内存的全局静态区

#include<stdio.h>
static a=5;
int fun()
{
    a=a*2;
    printf("a=%d\n",a);
    return 0;
}
int main()
{
    int i=0;
    for(i=0;i<10;i++)
    {
        fun();
    }
    return 0;
}

输出如下

a=10
a=20
a=40
a=80
a=160
a=320
a=640
a=1280
a=2560
a=5120

这个结果的原因在于,每次a的值是接着上一次函数调用的值继续运算的,并非每次都初始化从5开始计算,这就是static的特性。

同时用static定义的变量对于其他文件是不可见的。

auto类型

函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量

自动变量用关键字auto进行存储类别的声明,例如声明一个自动变量:

int fun(int a)
{
    auto int b,c=3;/*定义b,c为自动变量*/
}

a是函数fun()的形参,b、c是自动变量,并对c赋初值3。执行完fun()函数后,自动释放a、b、c所占的存储单元。

auto即变量只能在这一块使用,一般直接忽略

  1. const

const声明并且初始化后不能再修改值,否则编译都过不了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值