c++学习笔记
指针和内存的关系及它的逆向引用 pointers in c++
视频教程:youtube 原链接:https://www.youtube.com/playlist?list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb
讲述原始指针(raw pointer)而非智能指针(smart pointer)
1. 内存的重要性
计算机和内存打交道,内存是计算机的一切,也是编程中最重要的东西。
当你编写一个程序并启动,,整个程序被载入内存,所有对计算机的指令都被加载到内存中,这就是cpu访问程序并执行指令的方式。
当你创建一个变量,或者从硬盘中载入数据时,都将会被存储到内存中
而指针对管理和操纵内存极为重要
2. 指针是什么
指针是一个整数,它存储一个内存地址
#include <iostream>
#define LOG(x) std::cout << x << std::endl
int main()
{
void* ptr = 0;
std::cin.get();
}
void,没有任何类型。我们给ptr这个指针一个为0的内存地址。0不是一个有效的内存地址,意味着这个指针无效。0可以换成NULL或者nullptr
然后我们创建一个变量,用’&'运算符取它的地址
int main()
{
int var = 8;
void* ptr = &var;
std::cin.get();
}
这样我们就把变量var的地址存储在了一个指针ptr中
指针是一个包含地址的变量
3. 逆向引用
现在我们定义了一个指向内存地址的指针,但是当我们想去写入或读取数据,更改这个变量的数值的时候该怎么做,这时候逆向引用就会派上用场
当我们去更改指针指向地址的数值时,需要给指针定义一个类型
int main()
{
int var = 8;
int* ptr = &var;
*ptr = 10;
std::cin.get();
}
运行这段程序后,var的值会变成10.
创建任意内存大小的变量
int main()
{
char* buffer = new char[8];
memset(buffer,0,8);
delete[] buffer;
}
使用char创建一个名为buffer的8bytes的变量,使用memset填充指定内存,()内第一个是指定内存的开头,第二个是要填充的数值,第三个是填充内存大小。
上述代码中,我们使用了new这个关键字,因此该数据分配在heap上,我们还应该在处理完后使用delete删除这个数据。
指针本身也是变量,存储在内存中,因此我们可以有double pointers, triple pointers 之类的操作
int main()
{
char* buffer = new char[8];
memset(buffer,0,8);
char** ptr = &buffer;
delete[] buffer;
}
运行以后ptr地址存储的值是buffer地址