教你快速上手c语言(快速建立知识框架)

目录

1.什么是c语言?(发展历程)

常见编译器

2.第一个c语言程序

2.1如何写第一个c语言程序

2.2为什么c语言要写main(主)函数?

main特点:main函数在一个程序(工程)有且只有一个(不同文件也不行)(下方就是没有注意会出现的问题)

3.数据类型​编辑

3.1c语言提供的数据类型

单精度浮点数和双精度浮点数的大体区别

3.1.1为什么会出现这么多类型?

3.1.2每种类型的大小是多少?利用-sizeof()计算一个类型大小的-返回值是size_t-无符号整数

3.1.3c语言中有没有字符串类型?

3.2自定义类型-自己创造

4.常量和变量

4.1定义变量的方法

4.2变量的分类

如若一个变量名称冲突(既定义了用来全局变量,又用来定义局部变量,那么他是否会有两个值呢?-不会(非常不建议)

此外这两个变量是完全不同的变量-地址不同(不是重新赋值) 

 4.3变量的使用

4.4变量的作用域和生命周期-讨论的就是创建、销毁以及能否使用的问题

4.4.1什么是作用域、声明周期?

4.5常量

4.5.1字面常量

 4.5.2const修饰的常变量

如何证明以上的特点?

4.5.3#define定义的标识符常量

4.5.4枚举常量-生活中有一些的值是可以一一列举的(如:性别、三原色、星期、月份等)

 5.(对应3.1.3)字符串+转义字符+注释

如何证明字符串的结束标志是‘\0’?

 5.1.strlen函数(求字符串函数)​编辑

 5.2转义字符

6.注释

 c语言是一种结构化的语言-顺序、选择、循环结构,因此除了上方的顺序结构,还有选择和循环结构

7.选择语句

 8.循环语句

9.函数(函数可以类比工厂-传参就好像原料,返回值就好像产品)

10.数组(存放一组相同类型元素)

10.1 定义数组(数组名是arr-定义数组的时候【】中是常量(【常量】)--不绝对-c99标准中引入了变常数组的概念)

 10.2数组的不完全初始化(不必每个都放入值)​编辑

 10.3 数组的下标(可以通过下标访问元素)​编辑

10.4 数组的使用(多个元素-输出要通过循环)

 11.操作符(编译器识别操作符语义的时候是通过操作数来判断的)

①单目操作符(只有一个操作数)

1.!(补:c语言中,0表示假,非0表示真。 !成为零逻辑反操作)把假变真,把真变假

 2.-,+(和数学上的定义一样,放在数字前表示正,负的)

3.sizeof(计算操作数的类型长度(所占空间大小),输入的可以时变量和类型,单位是字节-切记不是函数)​编辑

4.++和--操作符(①分前置和后置++②以下只会演示++,--操作符同理)​编辑

②强制类型转换-()

 ③关系操作符(>,<,>=...)

 ④逻辑与和逻辑或

 ⑤条件操作符(唯一的一个三目操作符)

 ⑥逗号表达式(由逗号隔开的表达式)

​编辑

 ⑦【】(下标访问操作符-切记操作数(两个)是数组名和下标)

⑧()(函数调用操作符-操作数是函数名和形参)

12.常见关键字-由c语言提供,用户无法创造关键字,且关键字不能用作变量名

①extern(声明外部符号的,用于全局变量和函数(对于局部变量无意义-出了作用域便销毁))

 ②typedef类型重命名(起别名-主要给复杂类型使用)

③register

介绍register之前,我们需要来介绍一下存储器的概念

④static(静态的)-修饰静态(数据存储类型的指令)

为了更好地学习static,我们先要来了解内存分区的知识

1.static修饰局部变量​编辑

2.static修饰全局变量(本质上是改变了变量的链接属性)(全局变量在任意地方都可以使用,但是要正确的声明和定义-防止其他人使用)​编辑

3.static修饰函数(函数本身具有外部链接属性-使用static修饰函数类似于修饰全局变量-防止其他人使用)​编辑

13#define定义常量和宏

①#define定义常量​编辑

 ②#define定义宏​编辑

 ③#define定义宏与函数的比较

 既然宏具有两个缺点,那么能否说用函数就一定比定义宏来的好呢?

14.指针(初始)

14.1引入内存

 为什么内存不以bit为单位?

存放地址是为了找寻目标-如何使用指针找寻目标呢?

15.结构体(描述复杂对象的时候使用)

​编辑

 如何访问结构体成员变量?

①结构体指针​编辑

 ②结构体变量​编辑

 结构体类型过于复杂?用typedef类型重命名​编辑


1.什么是c语言?(发展历程)

C语言是一门通用计算机编程语言,广泛应用于底层开发。

二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI C,作为C语言最初的标准。 [1] 目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。----------较为广泛的是c89、c90、c99、c11这四个标准。

常见编译器

在今天这个时代,我们写代码都直接使用IDE(集成开发环境=编辑器+编译器+调试器..)软件。

其中编写c语言的编译器主要是GCC和MSVC等。

2.第一个c语言程序

相信以下程序我们在很多c语言入门书籍能够看见

#include <stdio.h>
int main()
{    
    printf("hello world\n");      
    return 0;
}

那么我们就来了解一下有关这个程序的知识

2.1如何写第一个c语言程序

写c语言代码,首先写出主函数

int main()   //-常用
{
    return 0;
}

void main() //-老式
{
    return 0;
}

//①int-整形

//②其中main()的()中可以不写形参(或者表示为(void)),但是最多可以有三个参数  分别是int argc ,char*argv[]两个命令参数和char *env[]环境变量参数

//③printf是一个c语言提供的库函数-按照特定格式打印输出到屏幕-使用时要包含头文件(相当于借用别人的东西要打招呼)下方的scanf则为输入。

//④stdio.h -std→标准 i→输入 o→输出 .h→头文件

2.2为什么c语言要写main(主)函数?

主函数是程序的入口-从main函数第一行开始执行

main特点:main函数在一个程序(工程)有且只有一个(不同文件也不行)(下方就是没有注意会出现的问题)

3.数据类型

3.1c语言提供的数据类型

单精度浮点数和双精度浮点数的大体区别

①在内存中单精度浮点数占用4个字节,双精度浮点数占用8个字节

②有效位数不同:单精度浮点数有效位数是8位,双精度浮点数有效位数是16wei

③编译器默认小数是双精度浮点数,如果想改成单精度浮点数,则在小数后面+f(5.5f)

3.1.1为什么会出现这么多类型?

提供丰富的类型,是为了选择适合的类型去更准确的描述生活中的问题

3.1.2每种类型的大小是多少?利用-sizeof()计算一个类型大小的-返回值是size_t-无符号整数

在讲述这个问题之前,我们要先介绍什么是“大小”

计算机的单位是bit,1个bit位可以存放一个二进制的0或1 (单位进制关系如图)

 因此如下图:我们可以看到每一个类型对应的大小(单位:字节),此外c语言规定long>=int的大小即可

3.1.3c语言中有没有字符串类型?

既然有"HelloWorld",这样的字符构成的字符串,且有char这种字符类型。

那我们很自然的会想到,字符串常量可以用什么类型的变量来装?

很遗憾,C语言里面没有专门的字符串类型。在C语言中,字符串是被当做字符数组来处理的。

3.2自定义类型-自己创造

如struct结构体,enum枚举,union联合体等待。

4.常量和变量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)

有些值是可变的(比如:年龄,体重,薪资)。

不变的值,C语言中用常量的概念来表示,变得值C语言中用变量来表示。

4.1定义变量的方法

变量类型 + 名字(要有意义-一般和程序实现的内部过程有关)

int age = 150;
float weight = 45.5f;
char ch = 'w';

4.2变量的分类

①局部变量② 全局变量

#include<stdio.h>
int b = 1000;//全局变量 - 定义在大括号的外部(函数)
int main()
{
	int a = 100;//局部变量 - 定义在大括号的内部(函数)
    printf("a = %d\n", a);
    return 0;
}

如若一个变量名称冲突(既定义了用来全局变量,又用来定义局部变量,那么他是否会有两个值呢?-不会(非常不建议)

此外这两个变量是完全不同的变量-地址不同(不是重新赋值) 

 4.3变量的使用

#include <stdio.h>
int main()    
{    
    int num1 = 0;   
    int num2 = 0;    
    int sum = 0;    
    printf("输入两个操作数:>");    
    scanf("%d %d", &num1, &num2);    
    sum = num1 + num2;              //定义一个变量存放相加后的值    
    printf("sum = %d\n", sum);    
    return 0;
}

4.4变量的作用域和生命周期-讨论的就是创建、销毁以及能否使用的问题

4.4.1什么是作用域、声明周期?

①作用域(scope):是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。

即一个变量哪里可以使用,哪里就是它的作用域。

1. 局部变量的作用域是变量所在的局部范围。

2. 全局变量的作用域是整个工程。

②生命周期:变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段

1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。

2. 全局变量的生命周期是:整个程序的生命周期。

4.5常量

4.5.1字面常量

 4.5.2const修饰的常变量

①const是一个c语言的关键字

如下的变量是可以修改的

 ②const -常属性-修饰变量后,变量(具有常属性)就不能再改 (本质上来说变量依旧是变量,只是从语法角度上来说不能再被修改)

如何证明以上的特点?

4.5.3#define定义的标识符常量

4.5.4枚举常量-生活中有一些的值是可以一一列举的(如:性别、三原色、星期、月份等)

因此引入了枚举类型

enum-枚举关键字

 5.(对应3.1.3)字符串+转义字符+注释

由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注:字符串的结束标志是一个\0的转义字符。

在计算字符串长度的时候\0是结束标志,不算作字符串内容。

如何证明字符串的结束标志是‘\0’?

 5.1.strlen函数(求字符串函数)

 5.2转义字符

①\n-回车(先到下一行,再到行首)-具有刷新缓冲区的作用

②%d-打印整形

③%c-打印字符

④%p-打印地址 

⑤%s-打印字符串

⑥%(l)f-(双)单精度浮点数 

6.注释

1. 代码中有不需要的代码可以直接删除,也可以注释掉

2. 代码中有些代码比较难懂,可以加一下注释文字

一般来说第2点常用,养成好的注释习惯非常重要

// -c++注释风格
/*  */ -c语言注释风格-不支持嵌套

 如图:报错

 c语言是一种结构化的语言-顺序、选择、循环结构,因此除了上方的顺序结构,还有选择和循环结构

7.选择语句

#include <stdio.h>
int main()
{   int input = 0;    
    printf("你会去敲代码吗?(选择1 or 0):>");    
    scanf("%d", &input);    
    if(input == 1)  
    {       
        printf("坚持,你会有好offer\n");   
    }   
     else   
    {      
        printf("放弃,回家卖红薯\n");   
    }    
     return 0;
}

 8.循环语句

//while循环的实例
#include <stdio.h>
int main()
{    
    printf("好好学习\n");    
    int day = 0;    
    while(day<=2000)   
    {   
        day++;        
        printf("我要继续努力敲代码\n");   
    }    
    if(day>2000)        
    printf("好offer\n");   
    return 0;
}

9.函数(函数可以类比工厂-传参就好像原料,返回值就好像产品)

10.数组(存放一组相同类型元素)

10.1 定义数组(数组名是arr-定义数组的时候【】中是常量(【常量】)--不绝对-c99标准中引入了变常数组的概念)

 10.2数组的不完全初始化(不必每个都放入值)

 10.3 数组的下标(可以通过下标访问元素)

10.4 数组的使用(多个元素-输出要通过循环)

#include<stdio.h>
int main()
{    
    int i = 0;
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<10; i++)
    {        
        printf("%d ", arr[i]);
    }    
    printf("\n");    
    return 0;
}

 11.操作符(编译器识别操作符语义的时候是通过操作数来判断的)

①单目操作符(只有一个操作数)

1.!(补:c语言中,0表示假,非0表示真。 !成为零逻辑反操作)把假变真,把真变假

 2.-,+(和数学上的定义一样,放在数字前表示正,负的)

3.sizeof(计算操作数的类型长度(所占空间大小),输入的可以时变量和类型,单位是字节-切记不是函数)

4.++和--操作符(①分前置和后置++②以下只会演示++,--操作符同理)

 注意++操作符易出现误用,如下图的代码情况

int a=1;
int b=(++a)+(++a)+(++a);
b=?;

上图的代码段看似能够用操作符的优先级来解决,但是实际情况是编译器不能正确判断是三个前置++先实现(结果==12),还是前面两个前置++先实现,相加完后的结果再来与后头a相加(结果==10)附上VS2019和Linux平台下跑出的结果

②强制类型转换-()

int main()
{
    int a=(int)5.20;//原本5.20,默认为double类型-(int)强制类型转换成int类型
    printf("%d,\n",a);
}

 ③关系操作符(>,<,>=...)

这些操作符和数学上的定义是一样的,使用关系操作符的时候要看两个操作数是否能被用来单纯的比较,比如一个字符串类型的变量就不能和int类型的变量来比较

 ④逻辑与和逻辑或

&&- 表示的是逻辑与(必须两个都满足,才为真)

||-表示的是逻辑或(至少一个满足就为真)

 ⑤条件操作符(唯一的一个三目操作符)

//条件操作符
//(exp1?exp2:exp3)

//如果表达式exp1为真,则exp2计算,exp3不计算
//如果表达式exp1为假,则exp2不计算,exp3计算

 ⑥逗号表达式(由逗号隔开的表达式)

//逗号表达式:(exp1,exp2,exp3...);

 ⑦【】(下标访问操作符-切记操作数(两个)是数组名和下标)

int arr[10]={0};
arr[5] //[]--下标访问操作符

⑧()(函数调用操作符-操作数是函数名和形参)

void swap(int *a,int *b)//()-函数调用操作符
{
    int tmp=*a;
    *a=*b;
    *b=tmp;
}

12.常见关键字-由c语言提供,用户无法创造关键字,且关键字不能用作变量名

// 1​​.auto(所有的局部变量本质上前面都有auto(被省略)-作用,出作用域销毁变量
// 2.break(用于switch和循环语句) 3.case(用于Switch语句)
// 4.六·大类型关键字    5.const-修饰变量(具有常属性)
// 6.continue(用于循环语句)   7.default(用于switch语句)  8.if和else(选择语句)
// 9.enum(枚举关键字)  10.extern(用于自定义类型关键字)
// 11.goto(实现分支-goto语句) 12.register(寄存器变量-类似于auto自动变量)
// 13.return返回(一般用于函数) 14.signed(有符号的)unsigned(无符号的)-指的是数字前有无符号
// 15.static(静态的) 16.struct-结构体,自定义类型关键字 17.typedef-类型重命名
// 18.union-联合体,自定义类型 19.void-空类型 20.volatile-段位关键字 21.while

//以下是几个基础的关键字

①extern(声明外部符号的,用于全局变量和函数(对于局部变量无意义-出了作用域便销毁))

 

 ②typedef类型重命名(起别名-主要给复杂类型使用)

unsigned int num=10;
typedef unsigned int uint;
uint num2=10;//unsigned int此时和uint等价

③register

介绍register之前,我们需要来介绍一下存储器的概念

register int a=20;就是建议把20放入寄存器当中
//之所以说是建议,是因为系统不会满足用户各种无理的要求,将一些无关紧要放入寸土入金的寄存器当中。最终会否放入寄存器,还得看系统的判断

④static(静态的)-修饰静态(数据存储类型的指令)

为了更好地学习static,我们先要来了解内存分区的知识

1.static修饰局部变量

 总结:1作用域并没有变化-2生命周期变长(存储位置变化,和程序的生命周期一致)-3变量可被修改(区别于const)

2.static修饰全局变量(本质上是改变了变量的链接属性)(全局变量在任意地方都可以使用,但是要正确的声明和定义-防止其他人使用)

3.static修饰函数(函数本身具有外部链接属性-使用static修饰函数类似于修饰全局变量-防止其他人使用)

13#define定义常量和宏

①#define定义常量

 ②#define定义宏

 ③#define定义宏与函数的比较

 既然宏具有两个缺点,那么能否说用函数就一定比定义宏来的好呢?

--答案是:不一定。因为函数的创建需要开辟额外的空间,当面临一个语句的重复调用时,重复开辟空间和调用函数会导致效率降低,如果直接用define定义的宏直接在预处理阶段展开和替换,不需要额外去开辟空间,可以在一定程度上提高效率。

14.指针(初始)

14.1引入内存

我国国土有960万平方公里-那么是如果管理的?-省(自治区)-市-县(合理划分),如何找人呢?-在某某大学(社区)几号楼,几零几--那么计算器存储也要合理划分,把空间细化,每一个空间都编号,每一个空间都有一个对应的地址和它对应关联)

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。

所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。

为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

 

 为什么内存不以bit为单位?

存放地址是为了找寻目标-如何使用指针找寻目标呢?

 总结:变量在内存中都会开辟空间,有着对应的一个地址,我们可以创建一个指针变量来存放这个地址(指针变量就是专门用来存放地址的)注意:寄存器和内存是两个不同的概念

15.结构体(描述复杂对象的时候使用)

结构体是C语言中特别重要的知识点,结构体使得C语言有能力描述复杂类型。

比如描述学生,学生包含:名字+年龄+性别+学号这几项信息。

这里只能使用结构体来描述了。

struct Stu
{   
    char name[20];//名字    
    int age;      //年龄    
    char sex[5];  //性别    
    char id[15]; //学号
};

 如何访问结构体成员变量?

①结构体指针

 ②结构体变量

 结构体类型过于复杂?用typedef类型重命名

 以上就是关于c语言的初探,对于初学者来说,就是多模仿,多上手,多思考。-纸上得来终觉浅,绝知此事要躬行。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值