提示:本篇文章为C语言数据类型的个人总结,内容如若有误,请及时联系我更正。
- 如若转载请注明原创,谢谢。
文章目录
前言
大家好,我是小明,很抱歉由于个人原因断更了一段时间,从今天开始恢复正常更新,今天总结的是C语言数据类型相关知识。
提示:以下是本篇文章正文内容:
一、数据类型
C语言的数据类型是编程中非常重要的一部分,它们对于内存管理、数据操作、代码质量、程序性能和兼容性都有着直接影响。
- 内存管理: 不同的数据类型占据不同大小的内存空间,了解数据类型可以帮助我们有效地管理内存。
- 数据存储和操作: 数据类型定义了数据的特性和可进行的操作。例如,整数类型可以进行加减乘除等算术运算,字符类型可以表示文本数据,数组类型可以存储一系列相同类型的数据等。
- 提高代码可读性和可维护性: 使用合适的数据类型可以使代码更易读、易懂,并且方便后续的维护工作。
- 提高程序性能: 选择合适的数据类型可以提高程序的执行效率。较小的数据类型通常需要更少的内存空间,可以减少内存使用量和访问时间。
- 兼容性和可移植性: 数据类型在不同的平台和编译器中可能会有差异。了解和正确使用C语言的数据类型可以增加代码的兼容性和可移植性,使程序能够在不同环境下正常运行。
那么,让我们来看一下C语言的数据类型:
数据类型 | 名称 | 所占字节(32位) |
---|---|---|
char | 字符型 | 1 |
short | 短整型 | 2 |
int | 整型 | 4 |
long | 长整型 | 4 |
long long | 更长的整型 | 8 |
float | 单精度浮点数 | 4 |
double | 双精度浮点数 | 8 |
- 查看数据类型的代码:
#include <stdio.h>
int main()
{
//计算各种数据类型的大小(单位是 字节)
printf("char:%d\n", sizeof(char));
printf("short:%d\n", sizeof(short));
printf("int:%d\n", sizeof(int));
printf("long:%d\n", sizeof(long));
printf("long long:%d\n", sizeof(long long));
printf("float:%d\n", sizeof(float));
printf("double:%d\n", sizeof(double));
return 0;
}
- 运行结果:
我们可以用 sizeof 关键字 来看一下他们各自所占空间的大小(单位为字节)。
- 字节:
- 由上面的知识我们可以接触到一个新概念:字节。我们生活中有很多类似的计量单位,如:电脑C盘、D盘的内存,手机常见的128G、256G,512G内存等,还有我们上网时所用到的流量200M流量、500G流量、1TB流量等等。
- 计算机中常见的存储单位主要有:bit(位)、B(字节)、KB(千字节)、MB(兆字节)、GB(千兆字节)、TB(太字节)、PB(拍字节)。
- 字节是存储数据的基本单位,并且是硬件所能
访问
的最小单位。内存中存储数据的最小单位是“位”。字节是存储数据的基本单位,位是存储数据的最小
单位,不要混淆了。C语言中一个字节通常由8位二进制数组成,可以表示256个不同的值,范围是从0到255。- 内存里面存放的全是二进制代码。内存里面有很多“小格子”,每个“格子”中只能够存放一个0或者1。一个“小格子”就是一位(bit),所以“位”要么是0,要么是1,不会有比 “ 位 ” 更小的单位。
- 8个“小格子”就是一字节,即一字节等于8位。(字节Byte,缩写 B)
常见存储单位的换算关系:8Bit = 1B;1024B = 1KB;1024KB = 1MB;1024MB = 1GB;1024GB = 1TB;1024TB = 1PB。
二、变量
1.什么是变量?
现实生活中我们会找一个盒子来存放物品,一来显得不那么凌乱,二来方便以后找到。计算机也是这个道理,我们需要先在内存中找一块区域,规定用它来存放数值,并起一个好记的名字,只要这个盒子还在,数值就会一直被保存,并且可以自由的取出和更改数值。
2.变量的定义
程序中用到的变量 必须 “先定义,后使用”。
1.不完全初始化:
数据类型 变量名 ;
int a;
int b;
int num;//此时a,b,num的值是随机值
2.初始化:
数据类型 变量名 = 初始化 ;
int a = 10;
int b = 20;
int num = 999; //声明时初始化
int x;
x = 999; //先声明变量 x,后初始化为 999
3. 连续定义多个变量:
数据类型 变量名= 初始化 , 变量名 = 初始化 , 变量名 = 初始化 ;
注意:
连续定义多个变量需要拥有相同的数据类型
,变量可以初始化,也可以不初始化。
//中间以逗号(,)隔开,结尾以分号(;)结束
int a = 10, b = 20 , num = 999;//初始化
int a, b, num; //不初始化
char M, N, P;
int a, b, c; //两个不同类型定义时需分别定义
3.变量的命名
变量的命名:
1. 只能由字母、数字、下划线组成,且第一个字符
不能
是 数字
2. C语言的标识符是 区分 大小写的,即一个字母的大小写,被认为是两个不同的字符
3. 不能使用 关键字 做为变量名
4.全局变量 和 局部变量
全局变量
具有全局作用域,它可以在整个程序中的任何地方访问。
局部变量
具有局部作用域,它只能在定义它的花括号{ }
内访问。
例如:
#include <stdio.h>
int z = 20;//全局变量
int main()
{
int x = 10;//局部变量
int y = 20;//局部变量
return 0;
}
那假如我们将全局变量和局部变量初始化为同名时,又该使用哪个值呢?
我们可以用一段代码来判断:
#include <stdio.h>
int year = 2023;//全局变量
int main()
{
int year = 2022;//局部变量
printf("现在是 %d 年\n", year);
return 0;
}
由此可见,当局部变量和全局变量同名的时候,局部变量优先使用
!
5.变量的 作用域 和 声明周期
作用域:
通常来说,作用域 指变量在程序中可见的范围。
生命周期:
生命周期 指的是变量或对象存在的时间范围。
变量的作用域和生命周期:
作用域 | 生命周期 | 默认值 | |
---|---|---|---|
普通全局变量 | 程序运行就创建,程序退出就销毁 | 都可以用,也可以被其他文件引用 | 0 |
静态全局变量 | 程序运行就创建,程序退出就销毁 | 不可以被其他文件引用 | 0 |
普通局部变量 | 进入该函数就创建,退出该函数就销毁 | 只在函数内部有效 | 随机值 |
静态局部变量 | 第一次进入该函数时创建,直到整个程序退出才销毁 | 在函数内部有效 | 0 |
三、常量
1.常量的定义
- 常量,表示一些固定的数据,也就是不能改变的数据。例如性别,男孩子女孩子,圆周率π等等这些固定且不会变的。(你要非说想去泰国,我只能说佩服你)
2.常量的分类
#define
定义的标识符常量const
修饰的常变量字面
常量枚举
常量
我们可以由下面这段代码来理解:
#include <stdio.h>
enum Sex
{
MALE,
FEMALE,
SECRET
};
//括号中的MALE,FEMALE,SECRET是枚举常量
int main()
{
//字面常量演示
// 3.1415926; //字面常量
// 2022; //字面常量
//const 修饰的常变量
const float p = 3.14f; //这里的p是const修饰的常变量
pai = 5.14;//是不能直接修改的!
//#define的标识符常量 演示
#define NUM 100
printf("num = %d\n", NUM);
//枚举常量演示
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
//注:枚举常量的默认是从0开始,依次向下递增1的
//也可赋值依次递增
return 0;
}
3.常见的常量类型
整型常量:
- 十进制整数。
例如:666,-120,0- 八进制整数,八进制形式的常量都以 0 开头。
例如: 0123,也就是十进制的 83; -011 , 也就是十进制的 -9- 十六进制整数,十六进制的常量都是以0x开头。
例如:0x123,也就是十进制的 291- 二进制整数,逢二进一,0b开头。
例如: 0b0010,也就是十进制的 2
实型常量:
- 小数形式
- 单精度小数:以字母 f 或字母 F 结尾。
例如:0.0f、1.01f- 双精度小数:十进制小数形式。
例如:3.14、 6.66- 默认就是双精度
- 可以没有整数位只有小数位。
例如: .3、 .6f
- 指数形式
- 以幂的形式表示,以字母
e
或字母E
后跟一个以10为底的幂数
例如:
C语言中的 2E3 或 2e3 表示数学中的 2 × 10 ²
C语言中的 1.23e4 或 1.23E4 表示数学中的 1.23×10⁴,即 12300- 字母 E / e 后面的指数必须为
整数
- 字母 E / e 前后必须要有
数字
- 字母 E / e 前后不能有
空格
字符常量:
- 字符型常量都是用
' '
(单引号)括起来的。
例如: ‘a’、‘b’、‘c’- 字符常量的单引号中只能有一个字符
- 特殊情况: 如果是转义字符,单引号中可以有两个字符。
例如: ’\n’表示回车、’\t’表示制表符
字符串常量:
- 字符型常量都是用
" "
(双引号) 括起来的。
例如:“a”、“abc”、“xiaoming”- 系统会自动在字符串常量的末尾加一个字符
'\0'
作为字符串结束标志
自定义常量:
此处先不用了解,后期涉及到的时候再讲
四、字符串和转义字符
1. 字符串
由上面常量涉及到的字符串,我们可以更为细致的总结一下:
“hello 小明”
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。
注:字符串的结束标志是一个 \0 的转义字符。这个 \0 在计算字符串长度的时是 \0 是结束标志,不算作字符串内容。
让我们用两段代码来探究一下 \0 的具体作用:
#include <stdio.h>
int main()
{
char arr1[] = "ming";
char arr2[] = {'m', 'i', 'n','g'};
char arr3[] = {'m', 'i', 'n','g', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
return 0;
}
执行结果:
由此可见,在没有 \0 做结尾时,arr2 在打印完 ming 后又随机打印了一段我们不需要的字符串,这是因为在初始化字符串数组时,只初始化了’m’, ‘i’, ‘n’,‘g’,而没有’\0’,所以当printf函数读到’g’时不会停止,它会一直往后走直到找到’\0’才会停止。
然后我们在通过strlen函数求一下三个字符串的长度,来观察一下有 \0 和没有 \0 的区别:
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "ming";
char arr2[] = { 'm', 'i', 'n','g' };
char arr3[] = { 'm', 'i', 'n','g', '\0' };
printf("arr1: %d\n", strlen(arr1));
printf("arr2: %d\n", strlen(arr2));
printf("arr3: %d\n", strlen(arr3));
return 0;
}
执行结果:
由上面可以看出,有 \0 的 arr1 和 arr3 两个字符串正常求得长度为4,而我们没有 \0 做结尾的 arr2 则求到了一个随机值16,这说明我们在求完长度后没有停止,一直往后找了12才遇到 \0 。
2.转义字符
通俗的讲,转义字符就是一种特殊的字符,这种字符是以反斜杠 \ 开头,用于实现特殊的要求。
转义字符 | 含义 |
---|---|
\n | 换行,从当前位置移到下一行 |
\t | 水平制表符(跳到下一个tab位置) |
\v | 垂直制表符 |
\b | 退格 |
\r | 回车 |
\’ | 单撇号字符 |
\‘’ | 双撇号字符 |
\\ | 表示一个反斜杠,以防被解释为一个转义序列符 |
\? | 问号,以防被解释为三字母词 |
\ddd | ddd表示1~3位八进制的数字 |
\xdd | dd表示1~2位十六进制数字 |
\0 | 空字符 |
最后的最后,小明为大家准备了一段代码,大家可以自己研究一下结果:
#include <stdio.h>
int main()
{
printf("\"hr\bi\'\40mil\bng!\"!\b\n");
return 0;
}
运行结果:
完结
好啦,阅读到这里就已经看完了本期博客的全部内容了