从零到一:C++自学笔记04(指针与引用)

2020.09.18

一、 指针

  1. 指针只是一个地址,它是一个整数,存储着一个内存地址。
    下面通过程序测试:
/pointer.cpp///
#include<iostream>
#define Log(x) std::cout<<x<<std::endl;

int main() {
	int num = 7;
	void*pointer = &num;
	Log(pointer);
	std::cin.get();
}

在Log函数引用行设置断点,开始调试程序。
在监视框输入pointer,查看其值。
在这里插入图片描述复制pointer的值,输入在内存1中进行查找,可看到该内存地址中存储着num的值7。
在这里插入图片描述
2. 如何请求开辟内存

char*buffer = new char[8];
memset(buffer, 1, 8);//在buffer中的八个字节中写入1


delete[]buffer;

在内存1中输入“buffer”即可查找到该内存地址中的存储情况。
在这里插入图片描述

  1. 如何使用指针套娃
char*buffer = new char[8];
memset(buffer, 1, 8);


char**ptr = &buffer;

delete[]buffer;

在delete行设置断点进行调试。
在监视框输入ptr查看其值。
在这里插入图片描述
复制ptr的值,输入在内存1中进行查找。
在这里插入图片描述
由于电脑内存地址是逆序的,故输入逆序地址进行查找。可以得到该内存地址中存储数字皆为1。
在这里插入图片描述

二、 引用

引用实际上是指针,是对已经存在变量的引用。它可以取消字母前的符号,使代码看上去更为简洁。
与指针的区别:指针可以被赋值为nullptr,但引用不可以。因为引用必须引用一个已经存在的变量,其本身不是新变量。引用并不真正占用内存,它不是真正的变量,只存在于源码中。
声明一个引用时,必须赋给它一个实际的值,不能只声明不引用。一旦声明一个引用,就不能再更改其引用的对象。
引入一个需要使用引用的情况:

/reference.cpp///
#include<iostream>
#define Log(x) std::cout<<x<<std::endl;
int decrease(int value) {
	value--;
	return value;
}
int main() {
	int a = 7;
	decrease(a);
	Log(a);
	std::cin.get();
}

此时整型a并不会真正执行自减,而时仍然返回7。现在使用指针实现值传递:

/reference.cpp///
#include<iostream>
#define Log(x) std::cout<<x<<std::endl;
int decrease(int* value) {
	(*value)--;
	return *value;
}
int main() {
	int a = 7;
	int*ptr = &a;
	decrease(ptr);
	Log(*ptr);
	std::cin.get();
}

此时得到a=6,但字母前符号太多,为了使代码更加简洁,使用引用实现值传递:

/reference.cpp///
#include<iostream>
#define Log(x) std::cout<<x<<std::endl;
int decrease(int& value) {
	value--;
	return value;
}
int main() {
	int a = 7;
	decrease(a);
	Log(a);
	std::cin.get();
}
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页