C基础笔记(简概)

C基础知识:

计算机五大主要部件:输入设备,输出设备,运算器,存储器,控制器。
RAM:内存 ROM:硬盘
编程语言三大类:机器语言 汇编语言 高级语言

一、运行

VS2019
1.
编译+调试运行
快捷键:F5
编译程序+调试运行程序
2.
编译+直接运行
快捷键:ctrl+F5
3.
F10:单步步过
F11:单步步入

二、原码,反码,补码

正数:三码合一,或者正数不区分这些
负数:
反码 是原码 最高位不变,其他位取反
补码 反码**+1**

三、预处理,库函数,关键字,注释,语句,main函数

1. 预处理命令
以**#号开头的一些命令,是在编译之前**,编译器对于源代码做的一些处理。
#if #else #define …
#include 这个命令,功能就是把包含的文件复制粘贴到命令所在的位置。
2.库函数
C语言将一些常用的代码,提供给开发者去使用。这些常用的代码,被放到了函数库中。
比如:

  • 要使用printf 需要#include <stdio.h>
  • 要使用system 需要#include<stdlib.h>
  • 要使用_getch 需要#include <conio.h>

如果要使用库函数,就必须先包含相应的头文件
3.注释
作用:
对于学习的时候来说,便于今后看代码的时候,进行复习。
对于工作来说,便于工作的交接。
4.语句
以分号为结尾的。

  • c语言执行的基本单位是语句
  • 组成C语言的基本单位是函数

5.main函数
main函数是C语言约定的入口,main函数为程序的入口、起点,程序运行时会先去找main函数。

四、格式控制符

表示整数的
%d 十进制整数
表示双精度浮点
%lf
表示单个字符
%c
表示字符串的
%s
其他的,后面再说
%o 八进制整数 %x 十六进制整数
%f 单精度浮点
%u 无符号整数

能够获取一个字符:getchar();
能够输出一个字符:putchar();
无回显的获取一个字符:_getch();

五、变量

整数变量:
int 4字节
short int 2字节
long int 4字节
unsigned 表示无符号数
字符变量:
char 1字节
wchar_t 2字节
浮点变量:
float 4字节
double 8字节
变量名(标识符)的命名规则:

  • a) 只允许数字字母下划线
  • b) 数字不能开头
  • c) 不能使用关键字
  • d) 区分大小写

六、函数

1.指令
system 执行一条cmd命令
printf 格式化输出
scanf_s 格式化输入
getchar 获取一个字符
putchar 输出一个字符
_getch 无回显的获取一个字符
abs 获取一个数的绝对值
strlen 求字符串长度
strcat_s 拼接字符串
strcpy_s 拷贝字符串
strcmp 比较两个字符串是否完全相等
2.定义函数
返回值类型 函数名称(形式参数类型 形式参数名称,形式参数类型 形式参数名称…)
{
//函数内的语句
return 返回值表达式;
}

//定义函数
int  GetMax(int a,int b)//形参
{
       if(a>b)
          return a;
else
          return b;
}
// 调用函数
int main()
{
      int nMax = 0;
      nMax = GetMax(10+5,20);//实参
      return 0;
}

3.全局变量和局部变量

  • static的作用:
    修饰局部变量的时候,起到一个静态的作用,离开静态局部变量的作用域时,不会销毁,下次再进入到函数中的,依然保留着上一次的值。
    修饰全局变量或者函数,起到了一个隐藏的作用,修饰之后,全局变量或者函数只能在当前文件中去使用了。

  • extern的作用:
    声明一个全局变量。表明这个变量在别的地方定义的,去别的位置找这个变量。

  • const的作用:
    定义一个不能修改的常量。可以指定类型。

七、指针

指针数组:首先它是一个数组,数组的元素都是指针。

	//指针数组
	int* p2[4] = {NULL,NULL,NULL,NULL};
	int  arrTest2[4];
	p2[0] = (int*)malloc(4 * sizeof(int));
	p2[1] = (int*)malloc(4 * sizeof(int));
	p2[2] = (int*)malloc(4 * sizeof(int));
	p2[3] = (int*)malloc(4 * sizeof(int));

数组指针:首先它是一个指针,它指向一个数组。

	//数组指针
	int(* p1)[4] = NULL;
	int arrTest1[4][4] = { 0 };

1.指针使用基本步骤

  1. 定义指针变量
  2. 给指针变量赋值(让指针指向一个位置)
  3. 解引用(获取到指向的位置处的数据)
	//1. 定义指针变量
	int* p = NULL;
	int nNum = 100;

	//2. 给指针变量赋值
	p = &nNum;
	//3. 解引用
	// p指向了nNum
	//使用*p相当于在使用nNum
	*p = 200;

2.指针的算术运算

  1. 加上一个整数或者减去一个整数:找到偏移为n的元素的位置
  2. 指针-指针:得到结果是两个地址之间能够存储多少个数据

八、结构体和联合体

1.结构体
结构体每一个成员都是单独占用内存空间。
在这里插入图片描述
在这个语法中,我们定义了一个变量,变量名是stcStudnet。这一个变量中包含着4个成员(字段)
2.联合体

//联合体中哪一个成员最大,哪一个就是联合体大小
//联合体所有成员,共用内存空间。
union TEST{
	char cCh;
	int nNum;
};

3.类型定义
typedef 能够给一个数据类型起一个新的名字(别名)
在这里插入图片描述

//这里有一个常见用法
typedef struct  _STUDENT {//类型名
	char szName[20];
	int nAge;
	int nHeight;
	double fWeight;
}STUDENT,*PSTUDENT;

九、堆空间

1.基本语法
申请:malloc

int* p = (int*)malloc(5*sizeof(int));

释放:free

free(p);
p = NULL;

2.内存操作函数
memset:给一块内存设置为同一个数值。

 //可以用于初始化堆空间
	memset(
		p,  //被设置的内存的起始地址
		0,  //要被设置的值
		5 * sizeof(int)//要被设置的字节数
	);

memcpy :内存拷贝,将一块内存拷贝到另外一块内存中

	//memcpy
	int arrTest[5] = { 5,3,7,10,11 };
	memcpy(
		p,   //目的内存
		arrTest,//源内存,从什么地方拷贝
		5 * sizeof(int)//拷贝多少个字节
	);

3.悬空指针和野指针
悬空指针: 一个已经被释放的内存,指针变量没有被置为NULL
在这里插入图片描述

//正确用法
free(p);
p=NULL;

野指针: 一个没有初始化的指针变量
在这里插入图片描述

//正确用法
int*q = NULL;

4.运行时,程序的内存分布
静态数据区:全局变量,静态局部变量
常量区: 字符串在里面
代码区: 里面都是代码
栈区: 局部变量,形参
堆区: malloc出来的,在堆区中

数据的生存期:从数据产生到销毁中间的一段时期

静态数据区的生存期:程序运行 到 程序结束
常量区:程序运行到程序结束
代码区:程序运行到程序结束
栈区: 自动生存期 进入{ 产生 离开} 销毁
堆区: 动态生存期 程序员控制 malloc 产生 free 销毁

作用域:符号起作用的范围。和生存期不是一个概念。
不一致的例子:静态局部变量
作用域:在{}内部
生存期:整个程序运行期间。

十、文件操作

1.绝对路径和相对路径
绝对路径:从根目录一个文件夹一个文件夹找到具体的文件。
D:\Test\abc\hello.txt
相对路径:从当前程序目录出发,找某一个文件
.就代表当前目录 …代表上一级目录
当前目录是什么?

  1. F5运行的时候,当前目录就是.cpp文件所在的目录
  2. 直接运行程序的时候,当前目录就是exe所在的目录

CPP基础知识:

一、内存的申请与释放

在c++当中,申请内存就变成了new和delete
区别

  1. malloc和free他们两个是函数,new和delete是C++的运算符。
  2. malloc只能返回void*类型的指针,需要我们自己强制转换,new申请什么类型就得到什么类型的指针,就不需要强制转换了。
  3. malloc不会调用类的构造函数,free不会调用类的析构函数,new会调用构造函数,delete会调用析构函数。
  4. C++中推荐使用new和delete了。

二、函数重载

函数重载:在相同的作用域内,函数的名字相同,但是参数不同。这样就构成了重载。
在我们调用函数的时候,会自动选择调用哪一个函数。
参数不同:

  1. 类型不同
  2. 顺序不同
  3. 个数不同

只有返回值类型不同,不能构成重载。
函数重载的好处:
我们不需要维护很多的函数名,使用起来非常便捷。
有一个专业名词:接口复用。函数重载也是一种多态机制

三、默认参数

默认参数只能从右往左设置,中间不能间断。
当我们的函数,既有声明,又有定义的时候,默认参数是写在声明当中

四、引用

引用和被引用的对象,共用内存。
引用和指针有什么区别????
引用必须初始化,指针不是必须初始化
引用一旦初始化,就不能够再引用其他变量了,指针可以在任何时候指向其他的位置。
指针的本质是一个变量,有名字,有自己的内存空间(用来存储地址的)。
引用没有自己的内存空间,和被引用的对象共用空间,引用是依赖于被引用的对象的。
传参方式
数值传递:
指针传递:本质上还是数值传递,只是数值是地址。不能说形参改变实参的。
引用传递:实参形参共用内存,这里可以说是形参改变实参
C++中推荐能够使用引用的地方,应该使用引用,因为引用更为安全

五、类

1.类的权限
public(公有的): 可以通过类的对象去使用的成员
protected(保护的权限): 不可以通过类的对象直接使用的成员
private(私有的权限): 不可以通过类的对象直接使用的成员
2.this指针
调用成员函数的时候,会隐含传递对象的地址进去。
this指针代表着调用这个函数的对象地址。
3.类和结构体区别
类的默认权限 是private 结构体的默认权限是public

六、构造与析构、拷贝构造、转换构造

1.构造函数
特点

  • 构造函数没有返回值,也不需要写返回值类型
  • 构造函数名和类名一致
  • 构造函数可以有参数,一个类可以实现多个构造函数,他们能够形成重载
  • 构造函数时自动调用的,在定义对象的时候会自动调用
    局部对象
    全局对象,静态局部对象 他们的构造只会调用一次
    堆对象

作用
用于初始化对象中的成员变量。
2.析构函数
特点
析构函数没有返回值,也不需要写返回值类型
析构函数的函数名是 ~类名
析构函数不能有参数,析构函数也就不能重载,析构函数只能有1个
析构函数在对象被销毁的时候,会自动调用
局部对象,离开作用域的时候,自动销毁
全局对象,静态局部对象 程序结束的时候,会自动销毁
堆对象,delete释放的时候,会销毁
作用
释放对象应该释放的资源。
3.拷贝构造函数

  • 1.浅拷贝
    在这里插入图片描述
  • 2.深拷贝
int nLenth = strlen(other.m_pName) + 1;
m_pName = new char[nLenth] {0};
//有了内存空间,再拷贝才是可以的
strcpy_s(m_pName, nLenth, other.m_pName);

4.转换构造函数(explicit)
在这里插入图片描述

七、继承

1.子类中会包含父类的所有成员,无论成员是公有的还是私有的。
在这里插入图片描述
2.构造析构的顺序问题
构造顺序:父类成员自己
假如有多个父类:
在这里插入图片描述
假如有多个成员:
在这里插入图片描述
析构函数的调用顺序,和构造函数完全相反

八、虚继承

1.虚基类
被虚继承的类,称之为虚基类。
虚继承有的时候,也被称之为菱形继承或者叫做钻石继承。
2.多态机制
理解 编译时运行时
编译时:程序在编译的一段时期
运行时:程序已经运行起来了,整个运行的时期

静态联编:函数的调用关系,在编译时期,就能够确定,叫做静态联编。大部分函数都是静态联编。
动态联编:函数的调用关系,在运行时间,才能够确定,叫做动态联编。
3.虚函数
通过父类指针指向子类对象,调用虚函数优先调用子类的虚函数,当子类中没有这个虚函数的时候,调用父类的虚函数。
封装性基础继承性关键多态性补充
4.重载,重定义,虚函数之间的区别
以上三种机制,函数名都是一样的
作用域 参数 使用关键字
重载: 相同 不同 不用
重定义: 不同(继承关系中) 可以相同,可以不同 不用
虚函数: 不同(继承关系中) 必须相同 virtual

九、模板

template<typename T>//函数模板

template<>//模板特化

template <class T>//类模板

class 类名
{

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值