news 2026/7/27 7:25:16

数据结构和变量常量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构和变量常量
  • 前言

c语言中的数据类型是什么?为什么需要数据类型?

我们用c语言编写程序是为了解决日常生活中的问题,而为了描述这些问题就需要相应的“量”,比如我在网购时,某个商品的价格、销售量、产品名称等数据都需要一个“量”来存储到内存中,“量”与“量”之间是有区别的,就如上例子,价格是小数,销售量是整数,产品名称是字符,它们都是不同类型的数据,整数要用整型的数据类型来描述量,小数要用浮点型的数据类型来描述量,字符要用字符型的数据类型来描述量。

所以数据结构就是用来修饰“量”(这个量就是c语言中的变量和某些常量)的修饰符,是专门用来批量、整齐管理一堆数据的工具,修饰后编译器就知道了这个“量”应该这么放到内存中(其实就是这个“量“放到内存中的哪个位置,给这 个“量”分配多大的内存)。

1.基本的的数据类型

1.1字符型

//字符数据类型--char char ch='a';//创建char型变量ch并初始化为字符a

在c语言中,字符要用单引号引起来,如'x','a','b'等,它们的数据类型都是字符型char。

2.2整型

//整型类型--int int num; int score;

2.3浮点型

float //单精度浮点型 double //双精度浮点型 float pi=3.14; //此时系统默认3.14是double类型 float pi=3.14f; //只有在3.14后加上f标记3.14才是float类型 double d=5.22;

2.4布尔类型

在c80/c89时期并没有为布尔值专门设立一个类型,使用整数0表示假,用非0表示真。

在c99标准中专门引入了布尔类型表示真假,布尔类型的取值为false或true

_Bool //c99标准中的布尔类型写法 //_Bool就相当于int,float等数据类型是关键字 _Bool flag=true;

如果想要使用bool来表示布尔类型就需要包含头文件#include<stdbool.h>,因为bool就是定义在头文件stdbool中的宏

#define bool _Bool #define false 0 #define true 1

代码演示:

#include<stdio.h> #include<stdbool.h> int main() { bool flag=true;//如果不加stdbool头文件可以用_Bool来创建布尔类型的变量 if(flag) { printf("I like C"); } return 0; }

在c23标准中正式把bool,false,true定义为关键字,再此标准中用bool来创建布尔类型可以不用包含头文件stdbool了。

2.类型修饰符

2.1short和long

short和long修饰数据类型后,改变了数据类型所申请的内存长度。

补充:内存的最小单位是比特(bit),1 bit=1个二进制位,二进制位上只能存放0或1,8个bit是一个字节,也就是一个字节有8个二进制位,一个字节可以存放的最大数是11111111(二进制)=255(十进制),内存长度越长所能表示的数越大。

short [int] //短整型 int //整型 long [int] //长整型 long long [int] //长长整型 //[]中的内容可以省略 //修饰浮点型 long double //c99引入

如果我们想要知道某一类型变量在内存中所申请的字节数,可以使用操作数sizeof

sizeof(type) //type是数据类型
//示例 printf("%zu",sizeof(int)); printf("%zu",sizeof(double));

sizeof的返回值(就是变量在内存中占几个字节)类型是size_t,在printf()中输出需要占位符%zu。

数据类型长度关系:

//整型家族 1==sizeof(char)<sizeof(short)<sizeof(int)<=sizeof(long)<=sizeof(long long) //浮点型家族 sizeof(float)<sizeof(double)<sizeof(long double)

2.2signed和unsigned

signed和unsigned专门用来修饰整型和字符型。它们用来改变数据类型所声明的变量所能表示的数的范围的。

  • 用signed修饰的变量,可以表示正数,负数和0;
  • 用unsigned修饰的变量,只能用来表示正数和0;
  • 整型的数据类型就等同于使用了signed修饰,只不过整型的signed一般忽略不写,如int等同于unsigned int
  • 对于字符型,char不等同于signed char,char可能是unsigned char,也可能是signed char,具体等价于哪个是编译器的具体实现定义的。
  • 于同一整型变量而言,用unsigned修饰后的数据类型所能表达的最大整数的范围扩近似大了没有修饰的一倍

在c语言中可以使用sizeof操作符来计算出各个数据类型和变量在内存中所占的字节数,sizeof返回值是无符号整数,但是c语言中并没有明确规定到底是那种无符号整数,可能是unsigned int,亦可能是unsigned long,甚至是unsigned long long,具体是由电脑自身系统决定的,这就不利于程序的移植性。

为解决这一问题,c语言中专门为sizeof制定了一个无符号整数类型size_t,用来统一表示sizeof的返回值,根据不同的系统它可能是unsigned long long,也可能是unsigned int。

2.3取值范围

不同的数据类型长度是不同的,不同长度的内存又决定了存放的数据的范围是不同的。

  • 整型家族的取值范围可以在头文件limits.h中查看
  • 浮点型家族的取值范围可以在头文件float.h中查看

数据类型 字节数 取值范围
char 1 -128~127
unsigned char2 1 0~255
short 2 -32768~32767
unsigned short 2 0~65535
int 4 -2147483648~2147483647
unsigned int 4 0~4294967295
long 4 -2147483648~2147483647
unsigned long 4 0~4294967295
long long 8 -9223372036854775808~9223372036854775807
unsigned long long 8 0~18446744073709551615
数据类型 字节数 取值范围(绝对值)
float 4 1.17549*10^-38~3.40282*10^38
double 8 2.22507*10^-308~1.79769*10^308
long double 12 2.22507*10^-308~1.79769*10^308

3.ASCII字符集和转义字符

3.1SASCII字符集

c语言中,char类型属于字符类型,也可以来表示字符,它也属于整型类型,那这些字符的值是多少呢?

对于不同的计算机它的值可能是不同的,因为不同的计算机可能采用不同的字符集,现在主流的字符集是ASCII字符集,你不需要记住ASCII字符集的内容,只需要在用的时候上网查看即可。

不过我们最好能够记住几组特殊的字符:

  1. 字符A-Z的ASCII值是65-90
  2. 字符a-z的ASCII值是97-122
  3. 相应的大小写字符ASCII值相差32
  4. 字符0-9的ASCII值是48-57
#include<stdio.h> int main() { printf("%d",'a');//输出的是字符a的ASCII值 printf("%c",97);//输出的是ASCII为97的字符 return 0; }

3.2转义字符

转义字符顾名思义就是转变了原来字符意思的字符,转义字符分为字符转义字符和数字转义字符

字符转义字符

  • \?:在书写连续多个问号时使用,防止被解析成三子字母,在新的编译器上已经没法验证了
  • \':用于表示字符常量 printf("%c",'/'');
  • \":用于表示一个字符串内的双引号
  • \\:用于表示一个反斜杠,防止他被翻译为转义字符
  • \a:警报
  • \b:退格键,终端光标前移一格
  • \n:换行符
  • \r:回车符
  • \t:制表符

数字转义字符

  • \ddd:d d d表示1~3个八进制的数字。如\130 表示字符X
printf("%c\n", 'X'); printf("%c\n", '\130'); printf("%c\n",88); //上面三个输出均打印字符X(大写的)
  • \xdd:d d表示两个十六进制的数字。如\x30 表示字符0
printf("%c\n", 'Q'); printf("%c\n", '\x51');//十六进制数字打印Q printf("%c\n", '\121');//八进制数字打印Q printf("%c\n", 81);

4.变量

学完数据类型后最重要的就是利用数据类型来创建变量,变量才是真正能够存储数据的,数据类型只不过是告诉内存自己所修饰的变量需要多大的空间,这就决定了变量这个“容器”能够装下下多大的数据。

c语言中把变化的量成为变量,变量在创建时就存数据,称为初始化,其后的叫做赋值>

int n=10;//初始化 n=1;//赋值

变量的命名规则

  • 变量名只能由数字字母下划线组成
  • 变量名不能由数字开头
  • 变量名区分大小写
  • 长度不超过63个字符
  • 变量名最好有意义
  • 变量名不能是关键字

4.1局部变量

局部变量就是在大括号内部或语句块内定义的变量,只能在其局限的范围内使用

补充:

作用域就是变量或常量起作用的区域

生命周期就是变量或常量起作用的时间

  • 作用域:在变量所定义的大括号内,外部无法访问
  • 生命周期:程序进入变量所在的大括号内(变量向内存申请地址),到程序出变量所在大括号(内存销毁)的这段时间
  • 初始化:局部变量未初始化时其值是垃圾值(随机数);所以一般建议初始化
  • 优先级:若局部变量和全局变量同名,则局部变量优先

4.2全局变量

全局变量就是在大括号外部定义的变量,其使用范围很广,在整个工程中,都是有办法是用的

作用域:在整个工程中,跨文件使用需要extern声明

生命周期:从程序运行到程序结束

初始化:若没有显性初始化默认初始化为0

使用建议:过度使用全局变量会使模块间的耦合度高,调试困难,谨慎使用。

int num = 1;//创建全局变量 void show() { printf("%d\n", num);//打印全局变量1 } int main() { int num = 2;//创建了与全局变量同名的局部变量,这两个变量是不同的变量,存储在内存中的不同位置 printf("%d\n", num);//局部变量和全局变量同名时局部变量优先,会在屏幕上打印局部变量的值2 show(); return 0; }
int num = 1;//创建全局变量num void show() { printf("%d\n", num);//打印1 } int main() { show();//调用show函数打印未修改全局变量前的值 num = 2;//修改了全局变量num的值为2 printf("%d\n", num);//打印2 return 0; }

5.常量

5.1字面常量

字面常量就是直接写出来的常量,如1,23,‘x’,“abc”,3.14

5.1.1字符字面常量

  • ‘a’ ‘X’

5.1.2整型常量

  • 十进制字面常量
  • 以0开头的八进制字面常量
    • 037(相当于十进制的31)
  • 以0x或0X开头的十六进制字面常量
    • 0x1F(相当于十进制的31)

5.1.3后缀

  • u或U:表示无符号整数常量(unsigned),如123u
  • l或L:表示长整型常量(long int),如12345l
  • ll或LL:表示长长整型常量,如123ll
  • 可组合:100UL(表示unsigned long)

5.1.4浮点型字面常量

  • 3.14(double)
  • 3.14f(float)
  • 3.14L(long double)
  • 3.14e3(科学计数法,表示3140)

5.15字符串字面量

  • “abc”

字面变量有类型,如10是整型类型,10LL是long long类型,‘a’是字符型,“aaa”类型是char [4]

数字/字符字面量无地址,是在编译时直接嵌入指令的立即数,字符串字面量有地址,可以&“aaa”

5.2宏常量(符号常量)

用#define定义的常量,宏常量无类型,无地址,只是文本符号,预处理阶段直接替换

#define M 100//使用#deifne定义的常量,常量名习惯上都用大写字母命名 int main() { printf("%d", M); return 0; }

5.3const修饰的常变量

用const修饰的变量,本质上还是变量(有类型,有地址),只是编译器禁止的它的赋值操作

int main() { const int n = 10;//const修饰的变量后,该变量变为常变量,有类型有地址,本质上还是变量,只不过编译器禁止的它的赋值操作 n = 100;//是错误的 return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 7:19:53

滚珠丝杆选型、安装与维护全攻略:从原理到实战解决高精度传动难题

在机械传动领域&#xff0c;滚珠丝杆是实现高精度、高效率直线运动转换的核心部件。无论是数控机床、工业机器人&#xff0c;还是精密测量仪器&#xff0c;其性能都直接决定了设备的定位精度与动态响应。然而&#xff0c;面对型号繁杂、参数众多的滚珠丝杆&#xff0c;如何快速…

作者头像 李华
网站建设 2026/7/27 7:18:33

Python语音合成技术:从Tacotron 2到WaveNet实战

1. Python语音合成技术全景解析在语音交互日益普及的今天&#xff0c;高质量的语音合成(TTS)技术已成为人机交互的关键环节。作为一名长期从事语音技术开发的工程师&#xff0c;我见证了Python生态中TTS技术的快速发展。从早期的机械音到如今接近真人发音的效果&#xff0c;开源…

作者头像 李华
网站建设 2026/7/27 7:15:26

C++线程池源码深度解析:从核心原理到性能优化实战

1. 项目概述&#xff1a;为什么我们需要深入理解线程池源码&#xff1f;在C后端开发或者高性能计算领域&#xff0c;线程池&#xff08;ThreadPool&#xff09;是一个绕不开的基础组件。你可能已经用过很多现成的库&#xff0c;比如C11之后的std::async&#xff0c;或者一些第三…

作者头像 李华
网站建设 2026/7/27 7:13:35

Oracle 19c RAC集群健康检查与故障排查指南

1. 项目概述Oracle 19c RAC&#xff08;Real Application Clusters&#xff09;作为企业级数据库集群解决方案&#xff0c;其多节点运行状态的稳定性直接关系到核心业务系统的连续性。在实际运维中&#xff0c;我们经常需要快速判断集群健康状态&#xff0c;但官方文档往往过于…

作者头像 李华
网站建设 2026/7/27 7:11:45

智能体设计模式:人机协同、RAG与A2A通信解析

1. 智能体设计模式解析&#xff1a;人机协同与多智能体通信在当今AI技术快速发展的背景下&#xff0c;如何让AI系统更高效、更安全地工作成为了开发者面临的核心挑战。本文将深入探讨三种关键的智能体设计模式&#xff1a;人机协同、知识检索(RAG)和智能体间通信(A2A)&#xff…

作者头像 李华
网站建设 2026/7/27 7:10:45

PTA基础编程题目集 7-5表格输出(C语言实现)

摘要&#xff1a;本文是一道C语言编程练习题&#xff0c;要求编写程序&#xff0c;严格按照给定格式输出一个包含省份、面积和人口数据的表格。题目没有输入&#xff0c;只需在控制台打印出指定的表格内容。文章提供了完整的输出样例和C语言实现代码。题目描述 本题要求编写程序…

作者头像 李华