反汇编: 先设置一个断点,调试后,在调试菜单中选择窗口,选择反汇编
**单词替换:**先按下ctrl+f查找,再替换
1.数组指针 int (*ptest)[5] {} //该指针可以处理每行有5个元素的数组;
2.指针数组 int* ptestA[5] //包含5个指针的数组
3.动态分配内存中
如果需要分配内存,在c中有以下几种
1.void* malloc(n*sizeof(int))
eg:int* p = (int*)malloc(10*sizeof(int));
2.void* calloc(x*sizeof(int)) 同1的区别就是会将分配的内存单元全部设为0
3.void* realloc(void*,int),适用于重新分配内存,重新分配后的内存数据不丢失,但是地址变化
eg:int* pa = (int*)malloc(4);
pa=(int*)realloc(pa,8);
4.void free(void* Block) 释放内存
free(pa);p = 0;
5.c++内存动态分配
int* p, * pm;
p = new int;
p[100] = 50;
pm = new int[x];
delete p;
delete[] pm;
6.复制内存
void* memcpy(void* 要复制的对象,void* 复制到哪儿,int size字节);
void* memset(void* Des,int val,size_t Size)
eg:memset(p, 0,100*sizeof(int));
4.引用
int a =10;
int b=10;
int& pa = a; /注意引用指向是不可以换变量的,只能指向a
pa = b ;/该操作是让a=b;
5.堆和栈: 堆是空闲内存,栈是程序在编译的时候就已经确定了大小的一段内存区域,效率要高于堆,但是容量有限
6.智能指针: std::unique_ptr是智能指针的一种,目的是为了解决原生指针安全性不足的弊端
智能指针只能指向一个内存空间,不可重复指向
声明语法:std::unique_ptr<类型> 变量名称{}
c++14以后,eg
std::unique_ptr<int[]> 变量名称 {std::make_unique<int[]> (5)} 该变量数组有5个值;
std::unique_ptr<int> 变量名称 {std::make_unique<int> (5)} /对该指针指向的值赋值为5
智能指针的方法:
reset()指令,会释放std::unique_ptr的内存空间,并且将std::unique_ptr设置为nullptr;
get(),将会返回std::unique_ptr的指针,返回的是原始(非智能)指针
release(); 将会返回std::unique_ptr的指针并且将std::unique_ptr设置为nullptr。
std::move()用于转移指针变量
eg:
std::unique_ptr<int> ptrA = std::make_unique<int>(150);
std::unique_ptr<int> ptrB;
ptrB = std::move(ptrA) ;/将ptrA转移到ptrB,此后ptrA会指向0;
7.共享智能指针: std::shared_ptr<int> ptrA{}
可以有多个std::shared_ptr指向同一地址,当最后一个指针释放后,才会释放其所占有的内存空间
生成方法,c++14后同上
std::shared_ptr<int> 变量名称 {std::make_shared<int> (5)} /对该指针指向的值赋值为5
/注意std::make_shared不支持数组,如果要用数组按下方式使用
std::shared_ptr<int[]> ptrC = new int[5]{1,2,3,4,5}
拥有方法:
long std::shared_ptr.use_count(); / 返回当前指针共有多少个对象调用
bool std::shared_ptr.unique();/返回当前是否只有一个智能指针指向该数据
bool std::shared_ptr.reset() / 将当前置nullptr,如果是最后一个,则释放内存
8.字符串
常量字符串是const char*类型
如果要在控制台输出中文字符–即 Unicode32,需要做本地化操作
#include<locale>
setlocale(LC_ALL, "chs");
9.指针和结构体
有以下代码,我们注意到如果是结构体的指针,是需要->来指向其中的元素的,只有实体才可以用.来访问
typedef struct Role {
int Hp;
int Mp;
}*PRole;
int main() {
Role user;
PRole puser = &user;
puser->Hp = 50;//指针偏移形式
user.Hp = 500;
}
编译器并不知道一个结构有多大,所以用指针的的时候,编译器只有通过该指针指向的元素离指针起始点的距离来确定该结构体元素,从下列汇编语言能看出一二
10.联合体 共享成员变量的内存
初始化方法:
①直接用字符串初始化
②std::string 变量名称 {“字符串”, 要截取的长度};
③std::string 变量名称{“字符串”, 起始位置,要截取的长度};
④std::string 变量名称 {要复制的个数, ‘字符’};
string连接字符串
str = “hyd123”+str1;
eg:string str2 = string{"abc"}+ "1234"
string连接字符
str = str1+‘a’;
基本方法:
1.转化为字符串
std::string std::to_string(数字)
2.字符串拼接
str1 = str.append(“456”);
str1 = str.append(“456”,1);截取第一个拼接
还有一些append方法和初始化方法相同
3.截取
str1.strsub(1),从1号位置开始往后都截取
str1.strsub(1,3),/从1号位置开始,截取3个位置
4.获取长度
int length = str1.length();
5.字符串的比较除了用> = <外,还有compare,返回int类型
6.搜索:如果要找到子串的起始位置信息,需要用到find函数
7.字符串的插入操作,可以在指定位置插入字符串
8.字符串的替换操作,可以替换某个字串
9.对字符串删除子串的操作
10.字符串与数字的转化
指针与字符串的关系
字符串string 类型是从第四个字节开始存放字符串的,有以下方法
stringstream: string类型可以类似std::cout创造一个流,更方便处理字符串,