目录
git工具的简化使用
- git工具是版本管理工具。(记录每一个版本的代码)默认git工具采用的是命令行形式。
- git的网站有Gitee和GitHub,Github(国外网站,访问速度慢)和Gitee(国内网站,访问速度快)是一种代码托管的网站(类似于qq空间中相册保存照片)。
- TortoiseGit是一种图形化的工具,使得git可以不通过命令行而通过图形化界面形式来实现操作。
- gitclone克隆远程仓库到本地电脑
- add -> commit -> push从本地电脑提交代码到远程仓库的过程。
VS2019的基本使用
- VS的拖拽:选中的模块可以拖动移动位置。
- VS的解决方案资源管理器不显示问题:
- VS的行号的设置:工具->选项->文本编辑器->c/c++->行号
什么是C语言?
- C语言是一门通用的计算机编程语言,广泛应用于底层开发。C语言提供了许多低级处理功能,依旧保持良好的跨平台性。
- 为了避免各个开发厂商使用C语言语法差异,制定了C语言的标准。由美国国家标准局为C语言制定的ANSI C为C语言的标准。国际标准化组织(ISO)和国际电工委员会(IEC)发布了的C11标准是C语言的第三个官方标准,也是C语言最新标准,该标准更好的支持了汉字函数名和汉字标识符。C89/C99.....C11(目前主流是C89/C99)。K&R标准是C语言之父定义的标准。(C语言之父,丹尼斯里奇和肯·汤普逊)
- C语言是一门面向过程的计算机编程语言。
- C语言的主要编译器有Clang、GCC、MSVC....
- C语言的发展史:二进制->汇编助记符->B语言->C语言。人与计算机交流:计算机语言(C/C++/java/python.....)
- 底层软件包含操作系统、驱动层,底层软件之上的是应用软件。驱动层用于关联硬件和操作系统。
- 集成开发环境(各种功能的集成):编辑器、编译器、链接器、调试器。vs2019就是集成开发环境 ,内部集成了msvc编译器。
- vs2019的使用:新建项目过程,定义项目名称(项目文件夹)->在项目文件夹上添加.c/.h文件,此时定义。c/.h文件的名字。在项目文件夹里双击.sln文件既可以打开项目文件。
- test.c/test.h文件(C语言代码就是.c/.h文件,.c是源文件,.h是头文件)-(编译器)->test.exe
第一个C语言程序
int类型和return类型对应是c99标准规定的
数据类型
- char 字符数据类型(字符和字符串有区别,C语言中字符用单引号,字符串用双引号)
- short 短整型(short int)
- int 整型
- long 长整型(long int)
- long long 更长的整型(long long int)
- float 单精度浮点型
- double 双精度浮点型
- C语言中sizeof()函数是用来计算变量/使用创建变量的类型的大小,大小单位是字节。(类型决定变量大小)(数据类型多是为了描述更多的不同的数据以及节约空间)
- 1byte=8bit;1kb=1024b;1mb=1024kb;1gb=1024mb;1tb=1024gb;
变量和常量
不变的值,C语言中用常量概念来表示,变化的值C语言中用变量来表示。
定义变量的方法
变量的创建要在内存中开辟空间,开辟空间的大小与类型息息相关。
变量在定义时候初始化是一种良好的代码风格。
定义变量不初始化,赋值为随机值。
变量的分类
局部变量和全局变量(局部变量和全局变量重名,局部变量优先)
C语言中一个{}就是一个代码块,代码块内定义的是局部变量,代码块外定义的是全局变量。
定义的全局变量不论数据怎么变化,他定义的空间一直在全局变量定义的空间上。
变量的使用
变量的作用域和生命周期(两者界限相对模糊)
- 作用域是程序设计的概念,通常来说,一段程序代码中所用到的名字并不是一直有效的,而限定这个名字可用性的代码范围就是这个名字的作用域。全局变量的作用域就是整个工程;局部变量的作用域就是变量所在的局部范围,即{}内。(宽度)
- 生命周期指的是变量从创建到销毁的一个时间段。全局变量的生命周期:整个程序生命周期;局部变量的生命周期:进入作用域生命周期开始,离开作用域生命周期结束。(长度)
- 在C99标准之前规定,变量要创建在代码块最前方,C99之后就支持了变量在哪里使用就在哪里定义。
- 局部变量作用域:变量所在的局部范围。全局变量作用域:整个工程。
- 局部变量生命周期:变量所在的局部范围。全局变量生命周期:主函数范围。
常量
C语言中常量分为:字面常量,const常变量,#define定义的标识符常量,枚举常量。
数组初始化时候可不定义长度
- 字面常量
- const常变量
- #define定义的标识符常量
- 枚举常量
字符串
C语言规定由双引号直接引起来的一串字符称为字符串字面值,简称字符串。
字符串结束的标志是一个\0的转义字符,在计算字符串长度时候\0是结束标志,不算字符串内容。(sizeof()用来计算字符的个数,strlen()用来计算字符串的长度)。
char arr[] = { 'a','b','c','d','\0' ,'\n'};
printf("%s\n", arr);//abcd
printf("%d\n", strlen(arr));//4
printf("%d\n", sizeof(arr));//6
char arr[] = { 'a','b','c','d' ,'\n' };
printf("%s\n", arr);//乱码
printf("%d\n", strlen(arr));//未知
printf("%d\n", sizeof(arr));//5
char arr[50] = { 'a','b','h' };
printf("%s\n", arr);//abh
printf("%d\n", strlen(arr));//3
printf("%d\n", sizeof(arr));//50
char arr[2] = "abc";
printf("%s\n", arr);//乱码
printf("%d\n", strlen(arr));//未知
printf("%d\n", sizeof(arr));//2
char arr[4] = "abc";
printf("%s\n", arr);//abc
printf("%d\n", strlen(arr));//3
printf("%d\n", sizeof(arr));//4
- 定义字符串的方法
- 要区别字符的定义和字符串的定义:char ch = 'a'; 定义字符且只可以存一个,这种方式不可以直接存字符串。
- C语言定义字符串只可以用char类型,因为字符串是由一个个字符拼接而成的。
- 数组的长度和字符串长度的区别:数组长度表示字符的个数长度,包含\0;字符串长度表示在遇见\0之前的字符个数,不包含\0。
- 一个英文字符占位8个bit,即1byte。
- C99标准以前不支持变长数组,C99标准支持变长数组。变长数组是指数组长度为变量。vs2019不支持C99标准。
- 示例(乱码部分不算在数组长度内,乱码部分一般计入字符串长度内)
- 数组部分初始化
- 有数组长度且大于字符项时候,没有\0,数组不会乱码报错;没有数组长度时候,数组项目后没有\0会乱码报错。
- 计算字符串长度的库函数是strlen(),属于string.h头文件。(库函数归属头文件的查询软件MSDN或者cplusplus网站)
转义字符
- 示例1(单独的\不被识别为一个字符)
- 转义字符用单引号引起来,算作是一个字符。(双引号引起来的用%s打印,单引号引起来的用%c打印)
- 常见的转义字符:\'表示常量' \"表示字符串内部的" \\表示一个反斜杠,防止他被解析为一个转义序列符 \b退格符 \n换行 \r回车 \t水平制表符 \ddd中ddd表示1~3个八进制的数字,比如\156或者\52、\6 \xdd中dd表示2个十六进制数字 打印\ddd或者\xdd的话打印的是转为十进制的对应的ASCII值
- 示例2
注释
- 注释可以用于提示文字的添加,也可以用于注释暂时不用的代码。
- 注释风格/* */ 或者 //
- 注释的快捷键ctrl+shift+/
选择语句
示例(C语言中0为假其他的非0判断为真,if后的()里为判断后真假值)
循环语句
三种循环语句:for循环,while循环,do...while循环
示例(循环的必要条件:定义循环变量,判断循环条件,循环变量自增/自减)
函数
C语言把一些独立的功能封装成一个函数。
函数可以放在前面或者后面(放在后面需要在前面声明),建议写在前面。
函数的特点是简化代码,代码复用。
数组
C语言中给出了数组的定义:一组相同类型的元素的集合。
数组长度大于数组项数时,后面未定义数组项为0;\0就相当于0
数组的每一个元素都有下标,下标从0开始,数组可以通过下标访问。
数组的使用:
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
char arr1[] = "abcdefg";
printf("%s\n", arr1);
char arr2[10] = "abc";
printf("%s\n", arr2);
for (int i = 0; i < strlen(arr1); i++)
{
printf("%c\n", arr1[i]);
}
操作符
- 算术操作符 + - * / %(取余)(取余只能用于整型)
int a = 9; int b = 4;//参与运算的两个数必须是整型 float c = a % b; printf("%f", c);//1.000000
- 移位操作符(针对二进制,针对一个数的二进制位进行操作,左移补0移位操作,右移删除操作)转二进制->移位操作。>>右移 <<左移 (将一个数转化为二进制之后进行左右移位)
- 位操作符(针对二进制,针对一个数的每一位二进制位进行操作)&按位与 |按位或 ^按位异或(按位异或就是相同为0,相异为1)对于一个负数而言先求补码再进行运算(计算机中数据存储以二进制形式),由于正数的原码和补码相同,所以可以直接计算。
int a = 3; int b = 5; int c = a & b; int d = a | b; printf("%d %d", c, d);//1 7 int a = -4; int b = -6; int c = a & b; int d = a | b; int e = a ^ b; printf("%d %d %d", c, d, e);//-8 -2 6
- 赋值操作符:赋值操作符 = 复合赋值操作符 +=、-=、*=、/=(a+=4------>a=a+4;)
- 单目操作符(逻辑取反操作符即真变假,假变真)按位取反是对数据的补码进行取反,取反以后的值为整数则可以直接使用,为负数则需要转为补码,因为在计算机内部存储的是补码。正数的补码原码反码都是一样的,负数的则不同。符号位参与运算。
int a = -2; int b = ~a;//对于符号位也取反 printf("%d", b);//1 int a = 1; printf("%d", (~a));//-2
int a = (int)3.1415926;//强制类型转化 printf("%d", a);//3
- 关系操作符 > >= < <= != ==(通过关系操作符可以返回一个真假值)
- 逻辑操作符 逻辑与&& 逻辑或||(针对的是表达式和变量,返回的是真假值)
- 条件操作符(简化的if语句)
- 逗号表达式(从左到右依次进行,整个逗号表达式的结果是最后一个表达式的结果)(x=3是一个表达式)
int a = 3; int b = 5; int c = 10; int d = (a + 2, b = a - 3, c = b + 4); printf("%d %d %d %d", a, b, c, d);//3 0 4 4
- 下标引用,函数调用操作符 数组下标引用符号[] 函数调用符号()
关键字(C语言内置存在的)
break char int float short long double if else const continue default do while for return signed unsigned sizeof void enum register union struct static extren auto typedef
- auto自动变量,自动创建,自动回收(所有的局部变量都是自动变量)
- break(终止循环)和continue(跳出本次循环)常用于循环;break和default用于switch。
- typedef顾名思义就是类型定义,这里应该理解为类型的重命名。(给类型起一个别名)
- register寄存器关键字 CPU-->寄存器-->高速缓存器-->内存-->硬盘-->网盘(register的速度快,造价高,空间小)
- enum(枚举)struct(结构体)union(联合体)这三个关键字可以自定义类型。
- static修饰变量和函数,static修饰的变量和函数称为静态变量和静态函数。
- (1) static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,直到程序结束生命周期才结束。(作用域不变,但是生命周期变长了,本质是改变了变量的存储类型,栈区存储——————>静态区存储 )
- (2)static修饰全局变量使得这个全局变量只能在本源文件内使用,不可以在其他源文件内使用。
- (3)static修饰函数使得这个函数只能在本源文件使用,不可以在其他文件使用。
#defne定义常量和宏
#define是预处理命令,编译C语言的第一步就是预处理阶段,这一个阶段就是宏发挥作用阶段。C预处理器在源代码编译之前对其进行一些文本性质操作,主要包括删除注释,插入被#include进来的文件,定义和替换由#define定义的符号。(文本性质操作就是指一段文本替换成为另一段文本,而不考虑其中任何语义内容。)
宏定义
- 宏常量:我们最常用的就是#define定义一个符号常量。
- 宏语句:我们还可以用宏定义一条或者多条语句。
- 宏函数:我们还可以用宏来定义函数,因为宏定义可以带参数。 对于宏定义和普通函数而言都是那里调用在此处使用一次,只是宏定义的参数是以表达式形式使用,函数定义的参数是直接使用表达式的结果。
指针
- 内存是电脑上特别重要的存储器,计算机上的程序都是运行在内存中进行的。为了有效的使用内存就把内存划分为一个个小的内存单元,每个内存单元的大小是一个字节。为了可以有效的访问到内存每个单元就给内存单元进行了编号,这些编号就被称为该内存单元的地址。
- 变量是创建在内存中的(在内存中分配空间),每个内存单元都有地址,所以变量也是有地址的。(变量的地址以所占的内存单元的第一个地址为准)
- 指针变量是用来存放地址的。地址被称为指针。
- &a是指获取到了地址,获取到了变量在内存中的位置,只有解引用才能获取到对应的值。scanf函数是通过获取地址给变量赋值。
- 定义指针变量:
- 解引用操作符*的使用(解析地址,*p<=>num)
- 解释说明
指针变量的大小
指针变量的大小取决于编译出的程序是多少位的,编译出的程序是多少位的取决于编译平台。X86是32位编译平台,编译32位程序;x64是64位编译平台,编译64位程序。32位是4字节,64位是8字节。
32为平台和64位平台区别:不同位数代表不同的地址线,不同位数代表识别的内存大小有区别。(位数多表示控制的字节数多,2^32个字节 2^64个字节)可以理解为地址就是不同位数平台的数字个数所描述含义
运算能力->数据总线位数=处理器字长:32位数据总线——计算机最多同时处理32位的数据。寻址能力->地址总线位数:N根地址线可以访问2^N个存储单元(本质上是N条地址线排列组合可以有 2^N个状态)
- 指针就是地址,64位CPU拥有更大的寻址能力,拥有更大的内存。(64位的平台兼容32位的程序)
- 寄存器的简单介绍:(只有64位的CPU才能支持64位系统平台,64位的系统才支持3.25GB以上的内存,64位的系统不可以装在32位CPU电脑上)
寄存器内部可以存放任何数据。
结构体
结构体使得C语言具有描述复杂类型的能力。(不同的类型组合在一起)
一个汉字占两个字节,一个英文占一个字节。
c语言的数据类型:内置数据类型(char,int,short,long,long long,float,double)自定义数据类型(结构体,枚举,联合体)(C/C++中数组是内置的数据类型,但不是基础数据类型而是构造数据类型,语义上是有限个占据连续物理空间的相同数据元素的有序集合。)
define不是关键字,是预处理指令。