一.数据类型
数据类型指定变量可以存储的数据类型,例如整数,浮点数,字符等。
1.过时的C语言分类
C 语言的数据类型
有以下C语言数据类型。
种类 | 资料类型 |
---|---|
基本数据类型 | int, char, float, double (整数类型和浮点类型) |
导出数据类型 | 指针类型、数组类型、结构类型、共用体类型和函数类型 |
枚举数据类型 | 枚举 ( 只能赋予其一定的离散整数值的变量) |
void数据类型 | 虚空 |
2. C语言数据类型的分类:
1.基本数据类型
基本数据类型是已经在编程语言中定义的数据类型,也称为内置数据类型。 这些数据类型是任何编程语言的基本构建块,并且许多派生数据类型都是从这种基本类型构建的。
我们可以使用 sizeof() 运算符和格式说明符 %lu 来检查任何变量的内存大小(Bytes)。
基本数据类型包括:
- char – 字符数据类型. 字符类型指的是单个字符,类型声明使用
char
关键字; - 整数数据类型 – 整数类型用来表示较大的整数,类型声明使用
int
关键字; - 浮点数据类型 -任何有小数点的数值,都会被编译器解释为浮点数。所谓“浮点数”就是使用 m * be 的形式,存储一个数值,
m
是小数部分,b
是基数(通常是2
),e
是指数部分。这种形式是精度和数值范围的一种结合,可以表示非常大或者非常小的数; 浮点数的类型声明使用float
关键字,可以用来声明浮点数变量。 - 空类型 – 代表函数类型,不用返回值
C语言支持有符号和无符号文字。基本数据类型的内存大小可能会根据32或64位操作系统而变化:
让我们看一下基本数据类型。它的大小根据32位体系结构给出。
资料类型 | 记忆体大小 | 范围 |
---|---|---|
char | 1个字节 | −128至127 |
signed char | 1个字节 | −128至127 |
unsigned char | 1个字节 | 0至255 |
short | 2字节 | −32, 768至32, 767 |
signed short | 2字节 | −32, 768至32, 767 |
unsigned short | 2字节 | 0至65, 535 |
int | 2字节 | −32, 768至32, 767 |
signed int | 2字节 | −32, 768至32, 767 |
unsigned int | 2字节 | 0至65, 535 |
short int | 2字节 | −32, 768至32, 767 |
signed short int | 2字节 | −32, 768至32, 767 |
unsigned short int | 2字节 | 0至65, 535 |
long int | 4字节 | -2, 147, 483, 648至2, 147, 483, 647 |
signed long int | 4字节 | -2, 147, 483, 648至2, 147, 483, 647 |
unsigned long int | 4字节 | 0至4, 294, 967, 295 |
float | 4字节 | |
double | 8字节 | |
long double | 10字节 |
2. 派生数据类型
派生数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“成员”或“元素”。
每个“成员”都是一个基本数据类型或又是一个构造类型。在 C 语言中,构造类型有以下几种:
- 数组类型 (arrays)- 数组类型实际上就是将原本只有一个的数据类型变成由多个相同数据类型相连的数据类型;
- 结构体类型 (Struct)- 结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项
- 共用体(联合)(Union)类型 – 共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型
- 指针类型 (Pointer) – 指向内存的地址。
3. 用户自定义数据类型
用户自定义数据类型主要包括枚举和别名
- 枚举 (enum)- 枚举是列出某些有穷序列集的所有成员。枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。
- Typedef – 别名. 主要用来定义常量.
二. 什么是内存?
从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2……、LPDDR)
从逻辑角度:内存是一组空间,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(当然了逻辑上也可以限制其为只读或者只写);内存在编程中是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。
内存实际上是由无限多个内存单元格组成的,每个单元格有一个固定的地址叫内存地址,这个内存地址和这个内存单元格唯一对应且永久绑定。
三. 什么是变量?
变量是存储位置的名称。它用于存储数据。其值可以更改,并且可以多次重复使用。这是一种通过符号表示存储位置的方法,以便可以轻松识别它。
1.变量的声明和使用
1)声明变量,即“根据数据类型在内存重申请一块空间”,这里需要给变量名
语法: 数据类型 变量名
double money; int age; boolean sex; float score;
2)给变量赋值,即“将数据存储至对应的内存空间”
语法: 变量名 = 值
money = 20.5; age = 18; sex = true; score = 80.8F;
这样的分解步骤有点繁琐,也可以将步骤(1)(2)合二为一,在声明一个变量的同时给变量赋值。
语法: 数据类型 变量名 = 值
double money = 20.5; int age = 18; boolean sex = true; float score = 80.8F;
2.定义变量的规则
- 变量可以包含字母,数字和下划线。
- 变量名可以以字母开头,并且只能使用下划线。它不能以数字开头。
- 变量名称中不允许使用空格。
- 变量名称不得为任何保留字或关键字,例如int,float等
有效的变量名称:
int a; int _ab; int a30;
无效的变量名称:
int 2; int a b; int long;
3. C语言中变量的类型
c中有多种类型的变量:
- 局部变量
- 全局变量
- 静态变量
- 自动变量
- 外部变量
1) 局部变量
在函数或块内部声明的变量称为局部变量,必须在块的开头声明它。
void function1() { int x=10;//local variable }
你必须先初始化局部变量,然后才能使用它。
2)全局变量
在函数或块外部声明的变量称为全局变量。任何函数都可以更改全局变量的值。所有功能均可用。
必须在块的开头声明它。
int value=20;//global variable void function1() { int x=10;//local variable }
3)静态变量
用static关键字声明的变量称为static变量。
它在多个函数调用之间保留其值。
例一)静态变量的应用
int main () { int x=10; //local variable static int y=10; //static variable x=x+1; y=y+1; printf("%d, %d", x, y); }
如果把main函数改为任意函数fun(),该函数fun()每调用一次,则本地变量将为每个函数调用输出相同的值,例如11, 11, 11,依此类推。
但是static变量会在每个函数调用中显示增加的值,例如11、12、13等。
4)自动变量
默认情况下,在块内声明的C中所有变量都是自动变量。我们可以使用auto关键字显式声明一个自动变量。
void main() { int x=10;//local variable (also automatic) auto int y=20;//automatic variable }
5)外部变量
我们可以使用一个外部变量在多个C源文件中共享一个变量。要声明外部变量,你需要使用extern关键字。
myfile.h
extern int x=10;//external variable (also global)
#include "myfile.h" #include <stdio.h> void printValue() { printf("Global variable: %d", global_variable); }
4.变量的声明和变量定义的区别
变量的定义为变量分配地址和存储空间; 变量的声明不分配地址,变量声明仅仅是把变量的位置及类型提供给编译器,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
一个变量可以在多个地方声明, 但是只在一个地方定义。
变量的声明有两种情况:
- 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
- 2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
注:除非有extern关键字,否则都是变量的定义。
extern int i; //声明,不是定义
int i; //声明,也是定义
四. 变量,数据类型和内存的关系
内存是一个物理设备,如何来存储一个数据呢?很简单,把内存想象成一间旅馆,要存储的数据就好比要住宿的客人。
在现实中,旅店的服务人员会询问要住什么样的房间,如:单人间、双人间、总统套间;然后,根据选择的房间类型,服务员会安排合适的房间。先开房间,后住 其实就描述了数据存入内存的过程。
首先,根据数据类型的类型为它在内存中分配一块空间(即找一个合适的房间),然后数据就可以放进这个空间(即入住)。
那么为什么对存储空间有要求呢?试想有3个客人,服务员就安排了一个人单人间,这能入住吗?分配的空间过小,会导致数据无法存储。
数据被存储在内存中,目的是便于在需要时取出来使用,或者如果这个数据被改变了,内存中存储的值也会随之相应的更新,以便下次使用新的数据。
变量与房间的对应关系
旅馆中的房间 | 变量 |
---|---|
房间名称 | 变量名 |
房间类型 | 数据类型 |
入住客人 | 变量的值 |
通过变量名可以简单快速的找到存储数据。
将指定给变量,就是将数据存储到以别名为变量名的那个房间;调用变量,就是将那个房间中的数据取出来。
可见,变量是存储数据的一个基本单元,不同的变量相互独立。
例二)各种变量内存占用的字节大小
#include
int main()
{
int a = 1;
char b = 'G';
double c = 3.14;
printf("Hello World!\n");
// printing the variables defined
// above along with their sizes
printf("Hello! I am a character. My value is %c and my size is %lu byte.\n", b, sizeof(char));
// can use sizeof(b) above as well
printf("Hello! I am an integer. My value is %d and my size is %lu bytes.\n", a, sizeof(int));
// can use sizeof(a) above as well
printf("Hello! I am a double floating point variable. My value is %lf and my size is %lu bytes.\n",c, sizeof(double));
// can use sizeof(c) above as well
printf("Bye! See you soon. :)\n");
return 0;
}
运行结果
变量其实只不过是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。大写字母和小写字母是不同的,因为 C 是大小写敏感的。基于前一章讲解的基本类型,有以下几种基本的变量类型:
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
2、另一种是不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的。
除非有extern关键字,否则都是变量的定义。
在 C 语言中,变量可以存储在不同的存储类别中,这些存储类别定义了变量在内存中的存储位置和生命周期。C 语言中的存储类别有以下几种:
自动存储类别:自动变量在函数调用时被创建,函数返回时被销毁。它们通常存储在栈中。
静态存储类别:静态变量在程序开始时被创建,在程序结束时被销毁。它们通常存储在数据段中。
寄存器存储类别:寄存器变量被存储在处理器的寄存器中,以便更快地访问它们。
外部存储类别:外部变量可以被不同的文件共享。它们通常存储在数据段中,但可以在其他文件中使用 extern 关键字来声明。
变量的存储类别可以使用关键字 auto、static、register 和 extern 来指定。
默认情况下,局部变量具有自动存储类别,全局变量和静态变量具有静态存储类别。
在程序运行时,根据变量的存储类别和作用域规则,变量将被分配在不同的内存位置,并且在程序的不同阶段具有不同的生命周期。对于不同的存储类别和变量作用域,C 编译器会生成不同的代码来处理它们,以便程序能够正确地存储和访问变量。