C语言基础【程序=算法+数据结构】——(数据结构

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;

}


**图示**


![在这里插入图片描述](https://img-blog.csdnimg.cn/4642b76a294a4de38d918fe3a4dd0411.jpeg#pic_center)


#### 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;

}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/872b9225621b4c668dd46261ac3e67c4.jpeg#pic_center)


### 三、空类型(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);
}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fd627a140f784370a32927cc523fcc8b.jpeg#pic_center)


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;
}


**图示**


![在这里插入图片描述](https://img-blog.csdnimg.cn/7e33f12efbd642b0a99c1eac378e6fd0.jpeg#pic_center)


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]);
}

}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe9e2b2557774496bd18fd47f5c052e6.jpeg#pic_center)


### 四、派生类型


#### 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的值
}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bcd8094b7fd7429ca0d38f931a847315.jpeg#pic_center)


#### 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;
}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/a2b3eac07a704c11a11da69e6b56745f.jpeg#pic_center)


#### 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);
}


**图示**  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0e141fdef265414baab72481003a2507.jpeg#pic_center)


#### 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;
}


**图示**


![在这里插入图片描述](https://img-blog.csdnimg.cn/61f219194f4d4b1196e8f8da37fffa90.jpeg#pic_center)


#### 4.5、函数类型


函数就是功能。每一个函数用来实现一个特定的功能,函数的名字应反映其代表的功能。  
 (1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件。  
 对较大的程序,一般不希望把所有内容全放在一个文件中,而是将它们分开放在若干个源文件中,由若干个源程序文件组成一个C程序。  
 一个源程序文件可以为多个C程序共用。  
 (2)一个源程序文件由一个或多个函数以及其他有关内容(如指令、数据声明与定义等)组成。一个源程序文件是一个编译单位,在程序编译时是以源程序文件为单位进行编译的  
 ,而不是以函数为单位进行编译的。  
 (3)C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main 函数,在main函数中结束整个程序的运行。  
 (4)所有函数都是平行的,即在定义函数时是分别进行的,是相互独立的的。一个函数并不从属于另一个函数,即函数不能嵌套定义。函数间可以互相调用,但不能调用main函数。  
 main函数是被操作系统调用的。  
 (5)从用户使用的角度看,函数有两种。  
 ①库函数,它是由系统提供的,用户不必自己定义,可直接使用它们。应该说明,不同的C语言编译系统提供的库函数数量和功能会有一些不同,当然许多基本的函数是共同的。  
 ②用户自己定义的函数。它是用以解决用户专门需要的函数。  
 (6)从函数的形式看,函数分两类。  
 ①无参函数  
 无参函数可以带回或不带回函数值,但一般以不带回函数值的居多。  
 ②有参函数。  
 在调用函数时,主调函数在调用被调用函数时,通过参数向被调用函数传递数据,此时有参函数应定义为与返回值相同的类型。


**代码实例**



#include <stdio.h>

/* 函数声明 */
int max(int num1, int num2);

int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;

/* 调用函数来获取最大值 */
ret = max(a, b);

printf( “Max value is : %d\n”, ret );

return 0;
}

/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;

if (num1 > num2)
result = num1;
else
result = num2;

return result;
}


**图示**


![在这里插入图片描述](https://img-blog.csdnimg.cn/70327051f93648edb3b194faa20441e8.jpeg#pic_center)


## ✨总结



![img](https://img-blog.csdnimg.cn/img_convert/afa2916de04b21d139aaebac151c5d71.png)
![img](https://img-blog.csdnimg.cn/img_convert/1e02eeeeba2377283e9267108f46681d.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}

图示

在这里插入图片描述

✨总结

[外链图片转存中…(img-oUVDcpyc-1714226842280)]
[外链图片转存中…(img-aPssGgnm-1714226842280)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值