16指针

指针

当你写一个程序的时候,你启动他,整个应用程序就会加载到内存,告诉计算机根据代码执行的操作都被加载到内存中,这是cpu实际访问你写的变量的方式。

指针,是一个存储内存地址数字

我们需要从内存中,读取或者写入东西,指针,就是内存的地址

忘记指针的类型

例子1-无类型指针 #

void* 表示我们不关心地址指向的实际数据是什么类型的

#include <iostream>
#define LOG(x) std::cout << x << std::endl

int main(){
	void* ptr=0;//0,表示这是一个无效指针
	//void* ptr=NULL;// NULL是一个# define NULL 0,其实也是0
	//void* ptr=nullptr;// c++11引入的
	std::cin.get();
}

void func(int); void func(void*); func(0);//调用func(int),而不是 func(void*),存在歧义 func(nullptr);// 明确调用 func(void*)

例子2-类型指针 #

	int var = 8;
	//void* ptr = &var;
	//int* ptr=&var;
	//double* ptr=(double*)&ptr;
	std::cin.get();

调试查看ptr地址上的值

指针类型,只有在读写该地址的数据时才有用(编译器才知道读写几个字节)

	int var = 8;

	//没有指定指针类型,编译器
	//不知道怎么存数据,*ptr=10会报错
	//void* ptr =  & var;
	//*ptr = 10;

	//指针指向的位置需要一个int大小(4字节)的
	//大小来存储数据
	int* ptr = &var;
	*ptr = 10;
	LOG(var);

创建堆上面的内存

//在堆上面分配连续的8个字节的内存空间
//并返回指向这块内存起始地址的指针
char* buffer=new char[8];//char* buffer:声明一个指向char类型的指针变量

//具体作用:将buffer指向的8字节内存的每一个字节全部填充为0
memset(buffer,0, 8);
//具体作用:将buffer指向的8字节内存的每一个字节全部填充为1
memset(buffer,1, 8);

delete[] buffer;

指针的指针 #

  • ptr存储的是buffer的地址

  • 这个地址上的值全被设置成0了