C++复合类型:引用和指针

C++复合类型:引用和指针

#include <iostream>
using namespace std;

/*
	复合类型:基于其他类型定义的类型
		常见:引用、指针

	引用:1. 右值引用(rvalue reference)
          2. 左值引用(lvalue reference)
	引用必须是一个对象,引用就是起一个别名,引用必须初始化。

	指针:是“指向”(point to)的一种复合类型
		1. 与引用类似,实现对其他对象的间接访问
		2. 指针本身是一个对象,允许赋值和copy,可以改变指向,无需赋初值。
	
	指向指针的指针:
		int *pi = &ival;
		int **ppi = &pi;

	指向指针的引用:
		int *pi = &val;
		int *&ref = pi;


*/

int compoundType() {
	cout << "compound type: rvalue reference" << endl;

	int ival = 1024;
	int& refVal = ival;
	int& refVal2 = refVal;
	
	/*
		1. refVal 是 ival 的引用,将refVal绑定在ival对象上
		2. refVal 改变,ival 也改变,ival 改变, refVal也改变
		3. refVal2 也通过 refVal 绑定在 ival 上
		4. 引用必须初始化
		5. 引用必须是一个对象, int &refVal = 10;就是错误的。
		6. refVal 和 ival 的类型一致
	*/

	cout << "ival: " << ival << endl;
	cout << "refVal: " << refVal << endl;

	refVal = 10;
	cout << "new ival after changing the refVal: " << ival << endl;
	cout << "refVal2: " << refVal2 << endl;

	cout << "pointer指针:" << endl;
	int val = 42;
	int* p = &val;  // 使用“取地址符” & 赋初值,使用“解引用符” * 来访问
	int* p2 = p;   // p和p2都是指针,保存val的地址,*p,*p2表示引用地址中的值

	cout << "p: " << p << " *p: " << *p << endl; // p是地址,*p是val对象
	cout << "p2: " << p2 << " *p2: " << *p2 << endl;

	// 使用 *p2 来重新赋值,则指针指向的对象的值也改变了。
	*p2 = 1;
	cout << "val: " << val << endl;  // 此处的val的值为1

	int* ptr = nullptr;  // 空指针的三种方式
	int* ptr1 = 0;
	int* ptr2 = NULL;

	int haha = 1234;
	p2 = &haha; // 改变了 p2 的指向,现在指向 haha 对象
	cout << "new pointer p2: " << *p2 << "old pointer p2: "<< val << endl;

	double pi = 3.14;
	void* pointer, * pointer1; // void 类型指针,不能使用 *pointer 访问,因为不知道具体类型。
	pointer = &haha;
	pointer1 = &pi;

	// cout << "void type pointer: 1. pointer: " << *pointer << endl;  // 此处引用报错,因为void类型指针,不知道具体的类型
	// cout << "void type pointer: 2. pointer1: " << *pointer1 << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章