网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
类型 | 字节数 | 取值 |
---|---|---|
int() | 4 | -2147483648 ~ 2147483647 |
unsigned int() | 4 | 0 ~ 4294967295 |
short() | 2 | -32768 ~ 32767 |
unsigned short() | 2 | 0 ~ 65535 |
long() | 4 | -2147483648 ~ 2147483647 |
unsigned long() | 4 | 0 ~ 4294967295 |
long long() | 8 | -9223372036854775808 ~ 9223372036854775807 |
unsigned long long() | 8 | 0 ~ 18446744073709551615 |
以上有”*“ 的是C99增加的,方括号表示其中的内容是可选的,即可以有,也可以没有。如果既未指定为signed 也未指定为unsigned的,默认为”有符号类型“。如signed int a 和 int a 等价。
有符号整型数据存储单元中最高位代表数值的符号(0 为正,1为负)。如果指定unsigned (为无符号)型,存储单元中全部二进位(b)都用作存放数值本身,而没有符号。无符号型变量只能存放不带符号的整数,如123,而不能存放负数,如-123。
由于左面最高位不再用来表示符号,而用来表示数值,因此无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。
1.1.5、字符型(char)
由于字符是按其代码(整数)形式存储的,因此C99把字符型数据作为整数类型的一种。但是,字符型数据在使用上有自己的特点,因此把它单独列为一节来介绍。
字符与字符代码
字符与字符代码并不是任意写一个字符,程序都能识别。例如代表圆周率的Π在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII字符集。各种字符集(包括ASCII字符集)的基本集都包括了127个字符。其中包括:
字母:大写英文字母A~Z ,小写英文字母a ~ z。
数字:0~9。
专门符号:29个,包括
!“ # & ‘ () * + — , / : ; < = > ? [ \ ] ^ _ ` { | } ~
空格符:空格、水平制表符(tab) 、垂直制表符 、换行 、换页(form feed)。
不能显示的字符:空(null)字符 (以 ’\0‘表示)、警告(以’\a’表示)、退格(以’\b‘表示)、回车(以’\r’表示)等。
前已说明,字符是以整形形式(字符的ASCII代码)存放在内存单元中的。例如
大写字母’A’ 的ASCII 代码是十进制数 65 ,二进制 形式为 1000001 。
代码实例
#include <stdio.h>
int main()
{
//输出字符A的整型
printf("'A' is %d\n",'A');
//输出整型65的字符型
printf("65 is %C\n",65);
return 0;
}
图示
1.1.6、*布尔型(bool)
布尔(Boolean)以英国数学家、布尔代数的奠基人乔治布尔(George Boole)命名。
bool是在C99标准中引入的类型,bool是专门用来表示真假的类型(即:bool类型只有两种情况true或false,也就是真或者假,没有第三种情况)。在引用bool类型前需要引用头文件<stdbool.h>。
代码实例
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool a;
a=10;
printf("bool is %d\n",a);
a=-1;
printf("bool is %d\n",a);
a=0;
printf("bool is %d\n",a);
return 0;
}
图示
2.1、浮点类型
2.1.1、单精度浮点型(float)
(1) float 型(单精度浮点型)。
编译系统为每一个float型变量分配 4个字节,数值以规范化的二进制数指数形式存放在存储单元中。
在存储时,系统将实型数据分成小数部分和指数部分两个部分,分别存放。小数部分的小数点前面的数为0。
2.1.2、双精度浮点型(double)
(2)double型(双精度浮点型)。
为了扩大能表示的数值范围,用8个字节存储一个double型数据,可以得到15位有效数字,为了提高运算精度,在C语言中进行浮点数的算术运算时,将float型数据都自动转换为double型,然后进行运行。
2.1.3、复数浮点型(float_complex,double_complex,long long_complex)
(3)long double(长双精度)型,不同的编译系统对 long double 型的处理方法不同,有的编译器对long double 型分配16个字节,而有的编译器则对 long double型和double型一样处理,分配8个字节。
二、枚举类型(enum)
如果一个变量只有几种可能的值,则可以定义为枚举(enumeration)类型,所谓“枚举”就是指把可能的值一 一 列举出来,变量的值只限于列举出来的值 的范围内。
声明枚举类型用enum开头。例如:
enum Weekday{sun,mon,tue,wed,thu,fri,sat};
以上声明了一个枚举类型 enum Weekday 。 然后可以用此类型来定义变量。例如:
[枚举类型]enum Weekday [枚举变量] workday , weekend ;
workday 和 weekend 被定义为枚举变量,花括号中的 sun , mon , … ,sat 称为枚举元素或枚举常量。它们是用户指定的名字。枚举变量和其他数值型量不同,
它们的值只限于花括号中指定的值之一。例如枚举变量workday 和 weekend 的值只能是 sun 到 sat 之一。
枚举常量是由程序设计者命名的,用什么名字代表什么含义,完全由程序员根据自己的需要而定,并在程序中作相应处理。
也可以不声明有名字的枚举类型,而直接定义枚举变量,例如:
enum {sun ,mon ,tue,wed,thu,fri,sat} workday ,weekend ;
声明枚举类型的一般形式为
enum [枚举名] {枚举元素列表};
其中,枚举名应遵循标识符的命名规则,上面的Weekday 就是合法的枚举名。
说明:
(1) C编译对枚举类型的枚举元素按常量处理,故称枚举常量。不要因为它们是标识符(有名字)而把它们看作变量,不能对它们赋值。
例如:
sun=0; mon=1; //错误,不能对枚举元素赋值
(2) 每一个枚举元素都代表一个整数,C语言编译按定义时的顺序默认它们的值为0,1,2,3,4,5… 。
也可以人为地指定枚举元素的数值,在定义枚举类型时显式地指定,例如:
enum Weekday {sun = 7 , mon=1,tue,wed,thu,fri,sat} workday ,week_end;
指定枚举常量sun的值为7,mon为1,以后顺序加1,sat 为 6。
2.1、实用场景
宏定义7个别名
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7
使用枚举实现
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
代码实例
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day;
day = MON;
printf("The %d day \n",day);
day = TUE;
printf("The %d day \n",day);
day = WED;
printf("The %d day \n",day);
day = THU;
printf("The %d day \n",day);
day = FRI;
printf("The %d day \n",day);
day = SAT;
printf("The %d day \n",day);
day = SUN;
printf("The %d day \n",day);
return 0;
}
图示
三、空类型(void)
void 类型指定没有可用的值。它通常用于以下三种情况下:
1、函数返回为空
C中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。
例如: void printf(int num);
代码实例
#include <stdio.h>
void printf\_d(int num);
int main()
{
printf\_d(1);
return 0;
}
void printf\_d(int num)
{
printf("The num is %d \n",num);
}
图示
2、函数参数为空
C中有各种函数不接收任何参数。不带参数的函数可以接收一个void。
例如 int num(void) 。
代码实例
#include <stdio.h>
int num(void);
int main()
{
int Data;
Data=num();
printf("The num is %d\n",Data);
return 0;
}
int num(void)
{
return 1;
}
图示
3、指针指向 void
类型为void*的指针代表对象的地址,而不是类型。例如,内存分配函数 void* malloc(size_t size); 返回指向void的指针,可以转换为任何数据类型。
返回值是一个void*(可以简单理解为一个没人知道它是什么类型的指针),一般我们都要对结果进行类型转换;
因为我们的a的类型是int*,而malloc返回的是void*,所以我们要通过(int*)来对malloc进行类型转换来得到我们需要的空间,可以是int也可以是double;
代码实例
#include<stdio.h>
#include<stdlib.h>
main()
{
int Data_d;
int \*a;
//相当于 int a[4] 整型为4个字节
a=(int\*)malloc(4); //分配空间
a[0]=0;
a[1]=1;
a[2]=2;
a[3]=3;
for(int i=0; i<4 ; i++)
{
printf("a[%d] is %d\n",i,a[i]);
}
free(a); //释放空间
printf("The value after freeing the space \n");
for(int i=0; i<4 ; i++)
{
printf("a[%d] is %d\n",i,a[i]);
}
}
图示
四、派生类型
4.1、指针类型(*)
每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就是没有掌握C的精华。
内存区的每一个字节有一个编号,这就是“地址”。
由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元 ,因此,将地址形象化地称为“指针”,意思是通过它能找到以它为地址的内存单元。
访问变量的方式:
1、直接按变量名进行的访问,称为”直接访问“方式。
2、将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问i变量。
指针指向-> :指向就是通过地址来体现的,如指针 p 中的值是变量 i 的地址(2000),这样就在 p 和变量 i 之间建立起一种联系,即便通过 p 能知道 i 的地址,从而找到变量 i 的 内存单元。
如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。 指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。
代码实例
#include<stdio.h>
int main()
{
int a=100,b=10; //定义整型变量a,b,并初始化
int \*pointer_1,\*pointer_2; //定义指向整型数据的指针变量 pointer\_1,pointer\_2
pointer_1 = &a; //把变量a的地址赋给指针变量 pointer\_1
pointer_2 = &b; //把变量b的地址赋给指针变量 pointer\_2
printf("a=%d,b=%d\n",a,b); //输出变量a和b的值
printf(" \*pointer\_1 = %d , \* pointer\_2 =%d\n",\*pointer_1 ,\*pointer_2);
//输出a和b的值
}
图示
4.2、数组类型([ ])
一批具有同名的同属性的数据就组成一个数组。
可知:
(1)数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
(2)用一个数组名(如S)和下标(如15)来唯一地确定数组中的元素。
(3)数组中的每一个元素都属于同一个数据类型。
定义一维数组的一般形式为:
类型符 数组名[常量表达式];
代码实例
#include<stdio.h>
int main()
{
int i,a[10];
for(i=0;i<=9;i++)
{
a[i]=i; //对数组元素a[0]~a[9]赋值
}
for(i=9;i>=0;i--)
{
printf("%d " ,a[i]); //输出a[9]~a[0]共10个数组元素
}
printf("\n");
return 0;
}
图示
4.3、结构体类型(struct)
C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,它称为结构体(structre)。
声明一个结构体类型的一般形式为:
struct 结构体名 {成员表列};
类型名 成员名;
定义结构体类型变量
1、先声明结构体类型,再定义该类型的变量
struct Student student_1, student_2;
结构体类型名 结构体变量名
2、在声明类型的同时定义变量
struct 结构体名{ 成员表列
}变量名表列;
3、不指定类型名而直接定义结构体类型变量
struct { 成员表列
}变量名表列;
结构体变量的初始化和引用
(1)在定义结构体变量时可以对它的成员初始化。初始化列表是用花括号括起来的一些常量,这些常量依次
赋给结构体变量中的各成员。注意:是对结构体变量初始化,而不是对结构体类型初始化。
C99 标准允许对某一成员初始化,如:
struct Student b={.name=“Zhang Fang”}; //在成员名前有成员运算符“.”
“.name” 隐含代表结构体变量b中的成员 b.name。其他未被指定初始化的数值型成员被系统初始化为0,字符型成员被
系统初始化为’\0’ ,指针型成员被系统初始化为NULL。
(2)可以引用结构体变量中成员的值,引用方式为
结构体变量名.成员名
在程序中可以对变量的成员赋值,如:
student_1.num = 10010;
"."是成员运算符,它在所有的运算符中优先级最高,因此可以把 student_1.num 作为一个整体来看待,相当于一个变量。上面赋值语句的作用是将整数 10010赋给student_1 变量中的成员num。
(3)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。
(4)对结构体变量的成员可以像普通变量一样进行各种运算(根据起类型决定可以进行的运算)
(5)同类的结构体变量可以互相赋值
(6)可以引用结构体变量成员的地址,也可以引用结构体变量的地址
代码实例
#include <stdio.h>
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book = {"C language ", "QIAO YI BO YI", "Programming language", 123456};
int main()
{
printf("title : %s\nauthor: %s\nsubject: %s\nbook\_id: %d\n", book.title, book.author, book.subject, book.book_id);
}
图示
4.4、共用体类型(union)
几个不同的变量共享同一段内存的结构,称为“共用体”类型的结构。
定义共用体类型变量的一般形式为
union 共用体名
{ 成员表列
}变量表列;
可以看到,“共用体”与 “结构体”的定义形式相似。但它们的含义是不同的。
结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。而共用体变量所占的内存长度等于最长的成员的长度。
代码实例
#include <stdio.h>
#include <string.h>
union Data
{
int i;
char str[4];
};
int main( )
{
union Data data;
printf( "Memory size occupied by data : %d\n", sizeof(data));
data.i=1;
for(int i=0;i<4;i++)
{
printf("%02x ",data.str[i]); //获取内存中的数据
}
return 0;
}
![img](https://img-blog.csdnimg.cn/img_convert/35a61db43631ab5ead9d881fbabd19a2.png)
![img](https://img-blog.csdnimg.cn/img_convert/9d5684cf3485c7600cf0497ab8d4b0ea.png)
![img](https://img-blog.csdnimg.cn/img_convert/33debb2ff6f29c18d63356655c9730ae.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
union Data data;
printf( "Memory size occupied by data : %d\n", sizeof(data));
data.i=1;
for(int i=0;i<4;i++)
{
printf("%02x ",data.str[i]); //获取内存中的数据
}
return 0;
}
[外链图片转存中...(img-TCG3a9KK-1714893375686)]
[外链图片转存中...(img-ykFlvpO5-1714893375687)]
[外链图片转存中...(img-YODHoWaK-1714893375687)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**