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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章