C语言—数据类型

2023-11-15

1 基本数据类型

C语言中,基本数据类型有整型(int),字符型(char)和浮点型(float,double)。在32位系统下的基本类型数据类型如下

类型 类型名 字节 表示范围
int 整型 4 - 2 31 ~ 231 - 1
unsigned int 无符号整型 4 0 ~ 232 - 1
short int 短整型 2 -215 ~ 215 - 1
unsigned short int 无符号短整型 2 0 ~ 216 - 1
long int 长整型 4 - 2 31 ~ 231 - 1
char 字符型 1 - 2 7 ~ 27 - 1
unsigned char 无符号字符型 1 0 ~ 28 - 1
float 单精度浮点型 4 3.4E ± 38 (7 位有效数字)
double 双精度浮点型 8 1.7E ± 308(15 位有效数字)
long double 长双精度型 10 1.2E ± 4932 (19 位有效数字)

除了上面列举的,还有long long int型,占8个字节,比long int表示的范围更大。很多时候,我们会在程序中见到下面这种定义

#define CODE   1024U

其中的“U”或者“u”,是指定为unsigned类型。加“F”或“f”为float类型,“L”或“l”为long double类型。如果一个小数后面不加后缀,默认为double类型。

#define CODE   1.024   // 默认为double类型
#define CODE   1.024F   // 为float类型
#define CODE   1.024L   // 为long double类型

2 数组,字符数组和字符串

2.1 数组

数组是存储同一种数据类型多个元素的集合。数组有一维数组和二维数组。定义数组方法如下

数据类型 数组名[数组长度]   // 一维数组
数据类型 数组名[数组行数][数组列数]   // 二维数组

数组的索引(也可以叫做下标,序号)是从0开始的。比如定义数组时,数组长度为n,那么数组的索引是从0 ~ n - 1

给数组赋初始值时,只能一位一位地赋。

int a[4] = {1,2,3,4}

对于没有给出数组长度,但是给出了数组初始值的情况。编译器会根据初始值个数和类型,给数组自动分配存储空间。

可以用sizeof计算数组空间的大小,也就是字节数。进而可以求数组的长度。比如求数组a的长度

#include<stdio.h>

int main()
{
	int a[4] = {1,2,3,4};
	
	printf ("数组a的长度为%d",sizeof(a) / sizeof(a[0]));
	
	return 0;
}

输出结果为

数组a的长度为4

2.2 字符数组与字符串

一个数组中元素为字符的数组,称为字符数组。字符串是一串连续的字符序列。个字符串常量用一对双引号括起来,比如"Welcome",编译系统自动在每一字符串常量的结尾增加“\0”结尾符字符串可以由任意字符组成,一个长字符串可以占两行或多行,但在最后一行之前的各行需用反斜杠结尾。比如

"STM32F103ZET6"

等价于

"STM\
32\
F103\
ZET6"

需要注意的是,"A"与'A'是不同的,"A"是由两个字符(字符"A"与字符"\0") 组成的字符串而后者只有一个字符。最短的字符串是空字符串"",它仅由一个结尾符"\0"组成。

3 枚举类型

枚举类型是一种用户定义的数据类型。枚举就是把可取的值一一列举出来。定义枚举类型的格式如下

enum 枚举类型名
{
    标识符1 = 整型常数1,
    标识符2 = 整型常数2,
    ……
    标识符n = 整型常数n,
};

如果在定义时没有给枚举成员赋值,编译时,编译器会自动给每一个枚举成员赋一个不同的整型值。第一个成员为0,第二个成员为1,以此类推。枚举类型的某一个成员赋值后,它后面的成员会按照依次加1的规则,确定自己的整型值。比如

enum temp
{
    temp1 = 2,
    temp2,
    ……
    temp10 = 20,
    temp11,
};

其中temp2对应的整型值为3。temp11对应的整型值为21。

4 结构体和共用体

4.1 结构体

利用结构体类型可以把一个数据元素的各个不同类型的数据项聚合为一个整体。结构体类型的声明格式为

struct 结构体名
{
	成员列表
}变量名列表;

定义结构体时,不能直接赋值。这里给出一种赋值方法

#include<stdio.h>

struct student
{
    char *name;
    char *number;
    int age;
}student;

int main()
{
    // 给结构体成员赋值
    student.name = "ertu";
    student.number = "20230711";
    student.age = 23;
    
	printf("**************************\n");
	printf("姓名:%s\n",student.name);
	printf("学号:%s\n",student.number);
	printf("年龄:%d\n",student.age);
	printf("**************************\n");
	
	return 0;
}

运行结果如下

运行结果

也可以定义结构体数组,存储多个相同结构的信息。

#include<stdio.h>

struct student
{
    char *name;
    char *number;
    int age;
}student[10];

int main()
{
    // 给结构体成员赋值
    student[0].name = "ertu";
    student[0].number = "20230711";
    student[0].age = 23;
    
	printf("**************************\n");
	printf("姓名:%s\n",student[0].name);
	printf("学号:%s\n",student[0].number);
	printf("年龄:%d\n",student[0].age);
	
	// 给结构体成员赋值
    student[1].name = "yingting";
    student[1].number = "20230711";
    student[1].age = 20;
    
	printf("**************************\n");
	printf("姓名:%s\n",student[1].name);
	printf("学号:%s\n",student[1].number);
	printf("年龄:%d\n",student[1].age);
	printf("**************************\n");
	
	return 0;
}

输出结果如下

输出结果

4.2 共用体

共用体的定义方法为

union 共用体名
{
	成员列表
}变量名列表;

共用体与结构体类似,不再赘述。

5. 拓展

5.1 结构体内存分配

结构体在分配内存时,有以下规则(在不同的环境中可能不同,这里只针对VC6.0)

  • 以结构体中占字节数最大的数据类型的字节数为单位开辟内存
  • 字节对齐

5.1.1 以结构体中占字节数最大的数据类型的字节数为单位开辟内存

换句话说,也就是结构体所占大小是其内部占字节数最大的数据类型的整数倍。这里看一个例子

#include<stdio.h>

struct temp
{
	int i;
    char j;
 
}temp;

int main()
{  
    printf("结构体所占字节数:%d\n",sizeof(temp));
    printf("i的地址:%p   j的地址:%p\n",&temp.i,&temp.j);
 
    return 0;   
}

输出结果如下

输出结果

结构体中占字节数最大的数据类型是int,占4字节。因此,在开辟内存时,以4字节为单位。虽然char类型只占1字节,但是依旧为它开辟了4字节大小的内存。

如果结构体成员中出现了数组,并不把数组看作整体来计算字节数,而是看数组的数据类型。也就是说,即使定义一个char j[5],在分配内存时,也不会把它看作一个占有5字节长度的数据类型。可以看一个例子

#include<stdio.h>

struct temp
{
	short int i;
    char j[5];
}temp;

int main()
{  
 
    printf("结构体所占字节数:%d\n",sizeof(temp));
    printf("i的地址:%p   j的地址:%p\n",&temp.i,&temp.j[0]);
 
    return 0;   
}

输出结果为

输出结果

如果结构体成员中出现指针变量,那么会以8字节为单位,开辟内存。可以看一个例子

#include<stdio.h>

struct temp
{
	short int i;
    char *j;
}temp;

int main()
{
	printf("结构体所占字节数:%d\n",sizeof(temp));
    printf("i的地址:%p   j的地址:%p\n",&temp.i,&temp.j);
 
    return 0;   
}

输出结果如下

输出结果

5.1.2 字节对齐

简单来说,就是存储变量的地址必须是变量所占字节数的倍数。字节对齐是一种用空间换取时间的策略,能够提高CPU读取数据的效率。

5.1.3 结构体中嵌套结构体

我们先看一个例子

#include<stdio.h>

struct temp1
{
    char m;
    char *n;
}temp1;

struct temp
{
	int i;
    char j;
    struct temp1 k;
}temp;

int main()
{
    printf("结构体temp1所占字节数:%d\n",sizeof(temp1));
    printf("结构体temp所占字节数:%d\n",sizeof(temp));
    
    printf("i的地址:%p   j的地址:%p\n",&temp.i,&temp.j);
    printf("m的地址:%p   n的地址:%p\n",&temp1.m,&temp1.n);
 
    return 0;   
}

输出结果如下

输出结果

由此可以看出,当有结构体嵌套时,两个结构体单独分配空间。分配空间时的单位是各自包含的结构体成员中占字节数最大的数据类型的字节数。最终的结构体所占内存大小为两个结构体所占内存大小的和。

5.2 联合体内存分配

共用体在分配内存时与结构体不同,共用体所占内存大小等于其成员中所占内存最大的成员的字节数。可以看一个例子

#include<stdio.h>

union temp
{
	int i;
    char j;
}temp;

int main()
{
    printf("结构体temp所占字节数:%d\n",sizeof(temp));
    
    printf("i的地址:%p   j的地址:%p\n",&temp.i,&temp.j);
 
    return 0;   
}

输出结果为

输出结果

可以看到,两个成员的起始地址相同。i和j存储时如下

共用体内存分配

5.3 数据类型转换

强制类型转换的格式为

(目标数据类型)变量/表达式

数据类型转换除了在计算时可以统一数据类型,在LCD显示变量时,它也有重要作用。比如想在LCD上显示实时温度。

温度模块已经检测出了温度值,数据类型为float类型。需要将“Temper:26”显示到LCD。这是可以直接将“Temper:”和温度模块检测到的环境温度直接打包,利用sprintf函数转换成字符串,显示到LCD。

unsignde char string[20];

sprintf((char*)string,"Temper:%.1f\r\n",temper);

5.4 typedef

利用typedef可以给数据类型起一个新的名字,比如我们在开发STM32时使用的一些u8,u16等,都是利用typedef定义的

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言—数据类型 的相关文章

随机推荐

  • java中char的类型范围,Java中基本类型占字节数以及Uint32的意思

    初学开发的时候 我的第一门语言是JAVA android方向 基本很少考虑java中基本类型的占用字节数 直到工作中接触到串口通讯 与单片机通讯 看着那些通讯文档 看着例如Uint16 Uint32 Uint64 Char 16 Char
  • 如何使用Windows命令关闭被占用的端口

    1 使用快捷键Windows R 打开运行 输入cmd 用管理员权限打开Windows 命令窗口 2 然后执行命令 netstat nao findstr 8080 此处已8080端口为例 小伙伴们若要关闭其他窗口 只需将此处8080更换为
  • Hive Sql 最强最完整学习笔记

    一 DDL语句 数据定义语句 对数据库的操作 包含创建 修改数据库 对数据表的操作 分为内部表及外部表 分区表和分桶表 二 DQL语句 数据查询语句 单表查询 关联查询 hive函数 包含聚合函数 条件函数 日期函数 字符串函数等 行转列及
  • 线程安全list_不安全的集合类学习子笔记

    list 不安全类是什么 不安全类是指在多线程并发的时候不能保证数据正确性的类 通常是由于这些类并没有加锁造成的 为什么不设计成加锁的 其实 在list之前有个集合类vector 它是内部加锁 它是一个线程安全类 不优先使用它的原因是加锁可
  • kali firefox gah. your tab just crashed. 更新Firefox

    kali firefox gah your tab just crashed we can help choose restore this tab to reload the page 这个问题我大概八月份的一个晚上也发生过当时是kali
  • Robotframework 之exe安装(二)

    Robotframework 之pip安装 一 Robotframework 之exe安装 二 Robotframework安装过程中错误解决方案 三 一 exe安装步骤 1 python 2 7 10 amd64 msi 2 安装Robo
  • R 语言 wordcloud 与 wordcloud2 包的安装及参数说明

    一 wordcloud安装说明 install packages wordcloud 二 wordcloud2安装说明 我在RStudio编辑器直接输入 if require devtools install packages devtoo
  • Flutter中屏幕自适应(iPhone iPad Windows)

    flutter屏幕自适应 文章目录 flutter屏幕自适应 适配手机和平板的重要性 一 Sizer插件的使用 二 使用步骤 1 准备工作 2 正常使用的样式 3 判断平台设备的样式 总结 适配手机和平板的重要性 这是未进行屏幕适配的界面
  • HC-05通信的正确打开方式

    1 蓝牙模块RX TX 5 VCC分别与串口线TX RX 5 GND连接 2 打开串口助手 设置串口 波特率9600 打开串口 3 按一下蓝牙模块上的微动开关 4 在串口助手上发送AT PC端就会有OK回应 其它相应指令也会有相同回应了 我
  • Eclipse中配置Tomcat容器

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题描述 独立启动tomcat后在浏览器输入http localhost 8080可以成功访问到tomcat主页 但是当在Eclipse中启动tomcat时 虽然启动成功
  • my97日期控件插件的开发与编写

    my97日期控件插件的开发与编写 扩展一个easyui 的my97 控件 function undefined function create target var state data target my97 opts state opt
  • ERROR: Could not build wheels for hdbscan, which is required to install pyproject.toml-based project

    pip安装hdbscan报错 ERROR Failed building wheel for hdbscan Failed to build hdbscan ERROR Could not build wheels for hdbscan
  • iOS开发中的网络请求

    转载自http www cocoachina com ios 20140919 9691 html 今天来说说关于iOS开发过程中的网络请求 关于网络请求的重要性我想不用多说了吧 对于移动客户端来说 网络的重要性不言而喻 常见的网络请求有同
  • N: 无法安全地用该源进行更新,所以默认禁用该源。

    解决方法 cd etc apt sources list d 进入该目录下 删除该目录下的文件 然后更换源 sudo apt get update
  • m计划-python

    题目描述 小明是个鹅卵石收藏者 从小到大他一共收藏了 n块鹅卵石 编号分别为 1 n 价值分别为 a1 a2 an 这天他乘船准备去往蓝桥王国 然而天有不测风云 小明所在的海域下起了暴雨 很快小明船上的积水越来越多 为了防止沉船 小明不得不
  • 有关 Rust 交叉编译的一些思路 (仅供参考)

    近来 使用 Rust 语言开发的应用程序渐渐融入了开发者以及普通用户的日常生活 它们不仅出现在我们常用的工作平台上 不少嵌入式设备或者云服务器上也多见它们的身影 Rust 是一种需要编译的语言 且一些 crate 仍需要 C C 的构建环境
  • 多个Makefile文件编译,Makefile多目标编译和多层次编译

    多个Makefile文件编译 Makefile多目标编译和多层次编译 README Makefile多目标编译 Makefile多层次编译 a文件夹 b文件夹 include文件夹 obj文件夹 多个Makefile文件编译 相关截图 ma
  • 论文集计算机,计算机学年论文集 计算机学年论文参考文献哪里找

    汇总了 100个 与计算机学年相关论文参考文献 为广大毕业生和职称者推荐计算机学年论文集 解决在校大学生不知个计算机学年论文参考文献哪里找等相关问题 一 计算机学年论文参考文献范文 1 试析西点军校计算机基础课程的改革 薛源 2006200
  • kudu clickhouse 添加字段删除字段

    impala 或hive 给指定kudu库中的表添加列 修改列并调整列位置 添加列 alter TABLE fact cpu supply category add columns supplier name string COMMENT
  • C语言—数据类型

    文章目录 1 基本数据类型 2 数组 字符数组和字符串 2 1 数组 2 2 字符数组与字符串 3 枚举类型 4 结构体和共用体 4 1 结构体 4 2 共用体 5 拓展 5 1 结构体内存分配 5 1 1 以结构体中占字节数最大的数据类型