1.基本类型
1.1 整形
首先在C语言中整型分为int、short、long、long long、float、double、long double、char,最大的特点就是在不同平台或编译器下所分配的内存空间不同,分为32位/64位平台,作者在这主要以64位为例。
(1)整形int(4字节)
取值范围: -2,147,483,648 到 2,147,483,647
无符号整形unsigned int(4字节)
取值范围:0 到 4,294,967,295
(2)短整形short(2字节)
取值范围:-32,768 到 32,767
无符号短整形unsigned short(2字节)
取值范围:0 到 65,535
(3)长整型long(4字节)
取值范围:-2,147,483,648 到 2,147,483,647
无符号长整形unsigned long(4字节)
取值范围:0 到 4,294,967,295
(4)更长的整形long long(8字节)
取值范围:-9223372036854775808到9223372036854775807
更长的无符号整形unsigned long long(8字节)
取值范围:0~18446744073709551615
长短整型和普通整形格式说明符均为%d
(5)单精度浮点数float(4字节)
取值范围:1.2E-38 到 3.4E+38
精度:6位有效位
格式说明符:%f
(6)双精度浮点数double(8字节)
取值范围:2.3E-308 到 1.7E+308
精度:15位有效位
(7)长双精度浮点数long double(16字节)
取值范围:3.4E-4932 到 1.1E+4932
精度:19位有效位
双精度浮点数和长双精度浮点数格式说明符均为%lf
浮点数在计算机内存中存储形式比较特殊,作者会单独写一篇文章讲讲
(8)字符型char(1字节)
字符型本质也是一个整形,在计算机中存储时依旧二进制数据,在使用格式说明符%c时,输出的是正常字符,但在使用格式说明符%d时,输出的就是该字符的ASCII值,对照下面的ASCII表,比如,输入字符a,使用格式说明符%c时,输出的是a,但在使用格式说明符%d时,输出的就是97。
ASCII图片来自菜鸟教程
下面是使用sizeof运算符在64位平台上输出的各类型大小
2.派生类型
2.1 数组
数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组可以由多种类型定义,比如int类型、char类型、float类型等。其次数组还分为一维数组和多维数组,比较常见的是一维数组和二维数组。
int arr1[] = {1,2,3,4,5}; char arr2[3] = {'a','b','c'}; char arr3[3] = "abc"; int arr4[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
以上述代码为例,整形数组arr1,其中存放了5个元素,则占用了4*5=20个字节,而数组名arr1后的[ ]中应该存放的是元素个数,在这里应该填上5,也可以不填,这样就不会局限元素个数,比如我再添加一个元素6,就不用再去改元素个数的值;同理,如果我在这定义了元素个数为5,在不修改元素个数的值情况下,添加一个元素6,这个时候就会造成越界访问,程序就会报错;再看看字符型数组arr2和arr3,两者所占字节均为3个字节,只是表现形式有所不同,arr2是将a,b,c看成3个元素存放,而arr3则是将abc看作一个整体存放;二维整形数组arr4的表现形式如上图,左边的[ ]表示行,右边的[ ]表示列,同理,这里的行,也就是左边的[ ]可以不定义元素个数,但右边不可以,在现实中这个数组应表现为:
1 2 3 4 5 6 7 8 9
但在内存中它依然和一维数组一样,每个地址都是连续的,在这我就不多赘述了。
2.2 指针
指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,你必须在使用指针存储其他变量地址之前,对其进行声明。例如:
int *a; /* 一个整型的指针 */ float *c; /* 一个单精度浮点型的指针 */ double *b; /* 一个双精度浮点型的指针 */ char *d; /* 一个字符型的指针 */
不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数。
在使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
#include <stdio.h> int main () { int a = 20; /* 实际变量的声明 */ int *b; /* 指针变量的声明 */ b = &a; /* 在指针变量中存储 a 的地址 */ printf("a 变量的地址: %p\n", &a ); /* 在指针变量中存储的地址 */ printf("b 变量存储的地址: %p\n", b ); /* 使用指针访问值 */ printf("*b 变量的值: %d\n", *b ); return 0; }
当上面的代码被编译和执行时,它会产生下列结果:
a 变量的地址:004FFB58 b 变量存储的地址:004FFB58 *b 变量的值:20
在指针类型中,还有一个特殊的指针,就是NULL指针;在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。
NULL 指针是一个定义在标准库中的值为零的常量。请看下面的程序:
如需检查一个空指针,你可以使用 if 语句,如下所示:
if(p) /* 如果 p 非空,则逻辑值为ture */ if(!p) /* 如果 p 为空,则逻辑值为ture */
2.3 结构体
结构体是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct student { int num; int age; char name[10] }stu;
student是结构体标签。
num,age,name是标准的变量定义。
stu结构变量,定义在结构的末尾,最后一个分号之前,你可以指定一个或多个结构变量。
我们在编写C语言程序时可以使用结构体指针结合"->"来访问成员变量。
例如 stu *S1 = &stu1;
stu1->num = 123;
结构体还可作为函数参数、嵌套结构体、指向结构的指针等操作,在此作者不多做赘述。
2.4 共用体
共用体(Union)在C语言中,是一种和结构体非常类似的语法,允许你在相同的内存位置存储不同的数据类型。你可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
定义共用体与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:
union student { int num; int age; char name[10]; }stu;
student类型的变量可以存储两个整数和一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。你可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。
共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,student将占用 12个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:
共用体可以用于同类型结构体之间直接赋值、结构体嵌套、匿名结构体等操作,在此也不多做赘述。
3.枚举类型
枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:
#defineMON 1 #defineTUE 2 #defineWED 3 #defineTHU 4 #defineFRI 5 #defineSAT 6 #defineSUN 7
这个看起来代码量就比较多,接下来我们看看使用枚举的方式:
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
枚举的定义主要有下面3种
1、先定义枚举类型,再定义枚举变量
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN }; enum DAY day;
2、定义枚举类型的同时定义枚举变量
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
3、省略枚举名称,直接定义枚举变量
enum { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
这篇文章主要目的是为了介绍数据类型,而且枚举在平时写代码中很少用到(对于初学者来说),所以在此作者就大概提一提。
4.空类型(void)
void 类型指定没有可用的值。它通常用于以下三种情况下:
(1)函数返回为空
C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
(2)函数参数为空
C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
(3)指针指向 void
类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。
在C语言学习中,void类型也是比较常见的数据类型,随着不断的学习应用,相信你很快就能掌握的!!!
由于篇幅太长,主要给新手入门介绍为主,有些知识点没有写得太详细,如有什么疑问,可以在评论区提出!以上内容有些参考菜鸟教程,还有作者平时所学整合而成,如有不正之处,敬请指出,制作不易,希望大家能给个一键三连,谢谢各位了🥺🥺🥺!