C++复合类型:引用和指针
#include <iostream>
using namespace std;
/*
复合类型:基于其他类型定义的类型
常见:引用、指针
引用:1. 右值引用(rvalue reference)
2. 左值引用(lvalue reference)
引用必须是一个对象,引用就是起一个别名,引用必须初始化。
指针:是“指向”(point to)的一种复合类型
1. 与引用类似,实现对其他对象的间接访问
2. 指针本身是一个对象,允许赋值和copy,可以改变指向,无需赋初值。
指向指针的指针:
int *pi = &ival;
int **ppi = π
指向指针的引用:
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 = π
// cout << "void type pointer: 1. pointer: " << *pointer << endl; // 此处引用报错,因为void类型指针,不知道具体的类型
// cout << "void type pointer: 2. pointer1: " << *pointer1 << endl;
return 0;
}