说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略

C语言有丰富的数据类型和运算符,因此计算能力非常强大,计算过程中使用的值一般用变量来存储。变量也是有分类型的,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域,C语言也提供了一些关键字来设置变量的属性(比如设置存储类型、生命周期)。

一、变量的作用域

C语言根据变量作用域的不同,将变量分为局部变量和全局变量。

1.局部变量
1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

2.全局变量
1> 定义:在所有函数外部定义的变量,称为全局变量。

2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

int a;int main ()
{int b;return 0;
}

第1行的变量a是全局变量,第5行的变量b是局部变量。

二、变量的存储类型

  • 变量的存储类型就是指变量存储在什么地方。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。变量的存储类型决定了变量何时创建、何时销毁以及它的值能保持多久,也就是决定了变量的生命周期。

  • C语言根据变量的存储类型的不同,可以把变量分为:自动变量、静态变量、寄存器变量。

1.自动变量

1> 定义:自动变量是存储在堆栈中的。

2> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量。

3> 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。

1 void test(int a, int b) {2     int c = a + b;
3
4     auto int d;
5 }

第1行的变量a、b,第2行的变量c、第4行的变量d都是自动变量。

2.静态变量

1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。

2> 哪些是静态变量:

所有的全局变量都是静态变量
被关键字static修饰的局部变量也是静态变量
3> 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束。

#include <stdio.h>int a;void test() {static int b = 0;b++;int c = 0;c++;printf("b=%d, c=%d \n", b, c);
}int main() {int i;// 连续调用3次test函数for (i = 0; i<3; i++) {test();}return 0;
}
  • 第3行的变量a、第6行的变量b都是静态变量,第9行的变量c、第16行的变量i是自动变量。

  • 因为第6行的变量b是静态变量,所以它只会被创建一次,而且生命周期会延续到程序结束。因为它只会创建一次,所以第6行代码只会执行一次,下次再调用test函数时,变量b的值不会被重新初始化为0。

  • 注意:虽然第6行的变量b是静态变量,但是只改变了它的存储类型(即生命周期),并没有改变它的作用域,变量b还是只能在test函数内部使用。

  • 我们在main函数中重复调用test函数3次,输出结果为:

3.寄存器变量

1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)

2> 哪些变量是寄存器变量:

被关键字register修饰的自动变量都是寄存器变量
只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行
寄存器变量只限于int、char和指针类型变量使用
3> 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

4> 使用注意:

由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理
为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能地为它分配寄存器存放,而不用内存

1 int main() {2     register int a;
3     return 0;
4 }

第2行的变量a是个寄存器变量。

【C语言】18-变量类型相关推荐

  1. C语言自定义变量类型——结构体详解

    文章目录 前言 为什么要学习结构体 什么是结构体 一.结构体:struct 1.结构体类型的声明 (1)结构体的基础知识 (2)结构体的声明 (3)特殊的声明 2.结构体的自引用 3.结构体变量的定义 ...

  2. C语言数据类型 / 变量类型 - C语言零基础入门教程

    目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...

  3. perl 语言(变量类型)

    perl之变量类型 perl 语言将变量类型分为标量,数组和哈希,perl在定义变量时会先加入一些符号来代表他们的类型.标量用$, 数组用@,哈希用% #!/usr/bin/perl $age = 2 ...

  4. c语言基础-变量类型和定义

    c语言基础-变量类型和定义 一.常量与变量 常量:固定的一个值 例如1 2 3 A B 变量:一个固定的内存地址,其中存储的值可以变化,这个地址的名字在程序体现就是变量 例子: #include &q ...

  5. C语言的变量类型(int、short、char、float...)及变量类型转换详解

    前言 单片机的基本功能是进行数据处理,而数据在进行处理时需要先存放到单片机的存储器中.所以在编写程序时对变量与常量都要先声明数据类型,以便把不同的数据类型定位到嵌入式处理器的不同存储区中. 具有一定格 ...

  6. c语言指针变量字节,C语言指针变量类型和大小

    指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?接下来对指针类型进行分析,剖析指针类型的特点. 指针的大小与其指向的内存中存储的变量类型无关,它只与计 ...

  7. python语言的变量类型_Python语言变量类型基础学习

    本文主要向大家介绍了Python语言变量类型基础学习,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. Python基本语法1.定义常量: 之前定义变量没有一起介绍定义常量,是因为P ...

  8. C语言(变量类型,输入,输出)

    1,变量类型 整形:int    占4个字节内存空间,共32位,表达的数值范围.(正负21亿) short int,缩写成short,占2个字节,65535最大值. long int,缩写成long, ...

  9. c语言常用变量,c语言基本数据类型(c语言常用变量类型)

    数据类型有:基本类型,导出类型,用户自定义类型 基本类型才包括:逻辑型 字符型 整型 浮点型 1.整型百int2(或4)同短整型(或长整型)2.短整型度short2-32768~327673.长整型l ...

  10. C语言各变量类型占字节数

    C语言变量所占字节数整理: 变量的基本类型包括:字符型.整型.长整型.浮点型. 每个变量在每个编译器所占的字节数不同,<the C Programming language>是这样说的: ...

最新文章

  1. Python 算法模板库,Pythonista 找工作利器
  2. android 声音,同时播放声音Android
  3. IO多路转接模型----(select的模型,select的优缺点,poll的模型,poll的优缺点)
  4. 自动化集成:Pipeline流水语法详解
  5. mysql select不走索引_避免写出不走索引的SQL, MySQL
  6. 用户输入年份,输出当前年份2月份的天数
  7. hulu往届笔试题及解题思路
  8. 董承非: 如何从各种类型的错误中学习
  9. html5浏览器提示翻译,IE浏览器自动翻译网页设置方法
  10. 《嵌入式 – GD32开发实战指南》第8章 PWM输出
  11. 唐宇迪学习笔记7:梯度下降策略
  12. MP3播放(javazoom.jl.player.Player)
  13. WSL安装及其后续配置
  14. App UI交互与视觉设计
  15. excel 简单制作数据透视表
  16. WeX5 V3.6 正式版核心特性
  17. 安装mavros时,运行 wstool update -t src -j8 时出错解决
  18. 远程桌面突然断开的处理办法
  19. 用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
  20. 在Windows下配置与使用CVSNT - dudu - 博客园

热门文章

  1. (一)Flask 学习 —— Hello World
  2. Servlet线程安全性
  3. 正则表达式匹配EXCEL地址字符串
  4. TCP网络通讯如何解决分包粘包问题
  5. 解决升级到Android Studio 3 Beta版本编译异常
  6. linux malloc 内存不足,linux中 对malloc/free分配及释放内存空间时发生的泄漏问题
  7. [2018.11.05 T2] 买牛奶
  8. mysql事件查看器_MYSQL事件查看器使用介绍 | 学步园
  9. mysql 查看锁表_MySQL的四种事务隔离级别
  10. 类实现接口,必须实现接口的全部方法么?