C语言初阶之数据类型

简介: 首先在C语言中整型分为int、short、long、long long、float、double、long double、char,最大的特点就是在不同平台或编译器下所分配的内存空间不同,分为32位/64位平台,作者在这主要以64位为例。

f4d5b8c8f66a45dab33ea0f2d487e827.png

368f69e683414961b4c5cbf780268171.png


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。


fd24c19346a5476d9ef0bb21c9eca706.png


ASCII图片来自菜鸟教程


下面是使用sizeof运算符在64位平台上输出的各类型大小


14052d8162fe4ead9ca9f45781e29ac8.png


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 指针是一个定义在标准库中的值为零的常量。请看下面的程序:


6d9456e8042849039adc4917c10db9c3.png


如需检查一个空指针,你可以使用 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个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。下面的实例将显示上面的共用体占用的总内存大小:


05bf63415ff946b6a7aee88179615bfb.png


共用体可以用于同类型结构体之间直接赋值、结构体嵌套、匿名结构体等操作,在此也不多做赘述。


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类型也是比较常见的数据类型,随着不断的学习应用,相信你很快就能掌握的!!!


     由于篇幅太长,主要给新手入门介绍为主,有些知识点没有写得太详细,如有什么疑问,可以在评论区提出!以上内容有些参考菜鸟教程,还有作者平时所学整合而成,如有不正之处,敬请指出,制作不易,希望大家能给个一键三连,谢谢各位了🥺🥺🥺!  


4d9d12054b664ec8a1246754d2ca4462.png

相关文章
|
3月前
|
存储 安全 C语言
C语言中的数据类型
C语言中的数据类型
|
3月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
1月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
43 1
|
1月前
|
C语言
3.4 C语言基本数据类型2
在C语言中,声明一个整型(int)变量时,需先写入&#39;int&#39;关键字,后跟变量名并以分号结尾。若同时声明多个变量,可在&#39;int&#39;后用逗号分隔列出所有变量名。例如,`int erns;` 或 `int hogs, cows, goats;` 都是合法声明。变量声明后需通过赋值语句如 `cows = 112;` 或使用函数如 `scanf()` 来初始化其值。
44 10
|
1月前
|
存储 程序员 C语言
3.1 C语言基本数据类型
在C语言中,整数类型如`int`类型是很有用的,它属于有符号整型,意味着该类型的值必须是整数,并且可以是正整数、负整数或者零。`int`类型的数值范围依据计算机系统有所不同,通常取决于系统的位宽。例如,在早期16位的IBM PC兼容机上,`int`类型使用16位存储,取值范围为-32768至32767;而在当前32位系统中,使用32位存储,拥有更宽泛的取值范围。随着64位处理器的普及,`int`类型能够存储的整数范围将进一步扩大。根据ISO C标准,`int`类型的最小取值范围被规定为-32768到32767。系统通常会利用一个特殊的位来表示整数的正负。
34 10
|
1月前
|
C语言
3.1C语言基本数据类型
在C语言中,初始化变量是指为变量设定初始值,通常在声明时直接完成,例如 `int cows=32;`。应注意避免在同一语句中混合初始化与未初始化的变量,如 `int dogs, cats=94;` 这样的写法容易引起误解。此外,整型常量如21、32等在C语言中被视为int类型,但非常大的整数则不然,且带有小数点或指数的数值不属于整型常量。
28 9
|
1月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
2月前
|
存储 C语言 索引
C 语言数据类型详解
C语言中的数据类型主要包括基本数据类型、构造数据类型和用户定义数据类型。基本类型如整型(`int`)、字符型(`char`)、浮点型(`float`)、双精度浮点型(`double`)和无符号整型(`unsigned int`)。构造类型包括数组(`Array`)、结构体(`Struct`)、共用体(`Union`)和枚举(`Enum`)。用户定义类型则通过`typedef`为已有类型定义新名称,并可通过结构体和共用体自定义复合数据结构。此外,还有指针类型用于存储变量地址,以及`signed`、`unsigned`、`short`、`long`等类型修饰符。
97 11
|
2月前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
1月前
|
存储 编译器 程序员
C语言数据类型详解
C语言数据类型详解
下一篇
无影云桌面