C语言—数据类型

文章目录

  • 1 基本数据类型
  • 2 数组,字符数组和字符串
    • 2.1 数组
    • 2.2 字符数组与字符串
  • 3 枚举类型
  • 4 结构体和共用体
    • 4.1 结构体
    • 4.2 共用体
  • 5. 拓展
    • 5.1 结构体内存分配
      • 5.1.1 以结构体中占字节数最大的数据类型的字节数为单位开辟内存
      • 5.1.2 字节对齐
      • 5.1.3 结构体中嵌套结构体
    • 5.2 联合体内存分配
    • 5.3 数据类型转换
    • 5.4 typedef

1 基本数据类型

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

类型类型名字节表示范围
int整型4- 2 31 ~ 231 - 1
unsigned int无符号整型40 ~ 232 - 1
short int短整型2-215 ~ 215 - 1
unsigned short int无符号短整型20 ~ 216 - 1
long int长整型4- 2 31 ~ 231 - 1
char字符型1- 2 7 ~ 27 - 1
unsigned char无符号字符型10 ~ 28 - 1
float单精度浮点型43.4E ± 38 (7 位有效数字)
double双精度浮点型81.7E ± 308(15 位有效数字)
long double长双精度型101.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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

ensp静态路由

要求&#xff1a; 1.全网可达 2.拓朴中所需地址全部基于192.168.0.0/24 3.静态路由&#xff08;不许使用其他动态&#xff09; 4.R2环回需要汇总 拓朴图&#xff1a; 将192.168.0.0/24划分为5个子网&#xff0c; 得&#xff1a; 192.168.0.0/27 192.168.0.32/27 192.168.0.64/…

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding 1. 文章简介2. 文章概括3 文章重点技术3.1 Transformer Distillation3.2 两阶段蒸馏 4. 数值实验5. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;TinyBERT: Distilling BERT fo…

媒体邀约:企业新品发布会如何邀约记者到现场采访报道?

媒介易是国内领先的全媒体广告营销平台&#xff0c;专注全媒体营销平台创新服务。我们有超过近11年的实战经验&#xff0c;我们拥有丰富的媒体记者资源&#xff0c;关于邀约记者到现场采访&#xff0c;我们会采取以下步骤&#xff1a; 1、提前策划&#xff1a;在发布会前至少…

6.溢出的文字省略号显示

6.1单行文本溢出显示省略号 必须满足三个条件 /*1. 先强制一行内显示文本*/ white-space: nowrap; &#xff08; 默认 normal 自动换行&#xff09; /*2. 超出的部分隐藏*/ overflow: hidden; /*3. 文字用省略号替代超出的部分*/ text-overflow: ellipsis;【示例代码】 <…

Azure Kinect DK 在设备管理器找不到此设备

参考 Azure Kinect DK 在设备管理器找不到此设备_Thomas_yx的博客-CSDN博客 type-c------------------type-c 接电脑&#xff0c;数据传输 圆------------------usb 电脑线

“AI+教育”:景联文科技高质量教育GPT题库助力教学创新

去年年底&#xff0c;OpenAI推出ChatGPT&#xff0c;掀起AI热潮&#xff0c;教育作为“AI”应用落地的关键场景&#xff0c;再次受到广泛关注。 “AI教育”的快速发展&#xff0c;是受到技术、需求和政策三重因素共同驱动的结果。 在技术方面&#xff0c;随着人工智能技术的不断…

CnosDB x LangChain: 聊着天来查询时序数据库

本篇我们将主要介绍如何使用 LangChain 连接 CnosDB 数据库&#xff0c;实现使用自然语言和数据库的交流。 大模型等的相关话题已经霸榜半年有余&#xff0c;在讨论关注之余&#xff0c;CnosDB技术团队将大模型与人工智能相关技术与数据库开发与实践进行融合。继CnosDB全面整合…

第三方ipad电容笔哪个品牌好用?平板电容笔推荐

可能很多人都认为&#xff0c;苹果原装的电容笔&#xff0c;是不可取代&#xff0c;但我认为&#xff0c;这还要看个人的预算&#xff0c;以及实际的需求。苹果Pencil对于那些不太讲究画质的用户来说实在是太贵了&#xff0c;要是我们仅用于书写上&#xff0c;其实我们可以用平…

编程导航算法通关村第 1关 | 单链表的操作

编程导航算法通关村第 1关 | 链表的操作 文章目录 编程导航算法通关村第 1关 | 链表的操作单链表链表的定义初始化链表的遍历获取链表的长度链表的插入链表的节点的删除 双向链表节点的定义双向链表的定义节点的打印获取长度头部插入元素尾部插入元素链表的删除 单链表 链表的…

jenkins发布使用邮件添加审批

首先安装好Email Extension Plugin插件并在 system下配置好邮件 然后配置流水线需要的参数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/418fc89bfa89429783a1eb37d3e4ee26.png#pic_center pipeline如下&#xff1a; def skipRemainingStages false //是否跳过生…

采集发布到WordPress网址(OneNav主题-WordPress主题)

WordPress系统的一导航主题&#xff08;OneNav主题&#xff09;是集网址、资源、资讯于一体的导航主题。 要将采集的数据批量自动发布到一导航主题&#xff08;OneNav主题&#xff09;的网址要怎么设置&#xff1f; 普通的文章采集器一般只能发布为wordpress文章类型&#xff…

自监督语义分割面模型——Masked Autoencoders Are Scalable Vision Learners(MAE)论文阅读

1、摘要 This paper shows that masked autoencoders (MAE) are scalable self-supervised learners for computer vision. Our MAE approach is simple: we mask random patches of the input image and reconstruct the missing pixels. It is based on two core designs. F…

SpringBoot使用JWT进行身份验证

JWT身份验证的流程 用户登录&#xff1a; 用户向服务器提供他们的用户名和密码。 服务器验证&#xff1a;服务器接收到请求&#xff0c;验证用户名和密码。 生成JWT&#xff1a;如果用户名和密码验证通过&#xff0c;服务器将创建一个 JWT。 JWT 包含了一些数据&#xff08;称…

[JVM] 5. 运行时数据区(2)-- 程序计数器(Program Counter Register)

一、概述 JVM中的程序计数器&#xff08;Program Counter Register&#xff09;是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间&#xff0c;几乎可以忽略不记。也是运行速度最快的存储区域。在 JVM 规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;是…

redis之主从复制、哨兵、集群

文章目录 一、redis的高可用1.1 redis高可用的概念1.2 Redis的高可用技术 二、redis 主从复制2.1主从复制的原理2.2搭建Redis 主从复制 三、Redis 哨兵模式3.1搭建Redis 哨兵模式3.2启动哨兵模式3.3查看哨兵信息3.4故障模拟 四、Redis 群集模式4.1搭建Redis 群集模式 一、redis…

【Excel】excel多个单元格的内容合并到一个单元格,并使用分隔符

方法一&#xff1a;使用连接符 & 左键单击选中“D2”单元格&#xff0c;在D2单元格中输入公式“A2&B2&C2”&#xff0c;按“Enter”即可实现数据合并。 ------如果想连接的时候&#xff0c;中间加分隔符&#xff0c;可以使用&#xff1a;公式A2&"&#xf…

Azure Kinect 之 Note(一)

Azure Kinect Azure Kinect DK 是一款开发人员工具包&#xff0c;配有先进的AI 传感器&#xff0c;提供复杂的计算机视觉和语音模型。 Kinect 将深度传感器、空间麦克风阵列与视频摄像头和方向传感器整合成一体式的小型设备&#xff0c;提供多种模式、选项和软件开发工具包(S…

面试题更新之-HTML5的新特性

文章目录 导文新特性有哪些&#xff1f;HTML5的新特性带来了许多好处 导文 面试题更新之-HTML5的新特性 新特性有哪些&#xff1f; HTML5引入了许多新特性和改进&#xff0c;以下是一些HTML5的新特性&#xff1a; 语义化标签&#xff1a;HTML5引入了一系列的语义化标签&#…

远程在Ubuntu20.04安装nvidia显卡驱动

第零步&#xff0c;找人装一个todesk。 在终端运行&#xff1a; ifconfig 记住ip地址&#xff0c;后面要用。 第一步&#xff0c;安装软件&#xff1a; sudo apt-get update sudo apt-get install g gcc make 第二步&#xff0c;下载显卡驱动&#xff1a; 官方驱动 | NVI…