和 *,以及 -> 和 .
这两个符号——& 和 *,以及 -> 和 . 在C++中都是非常基础而且重要的内容,尤其是涉及指针和引用时的应用。为了帮助你系统、清晰、详细理解,我会逐个讲解这些符号的含义、作用、场景,并配合示例让你更直观地理解。
一、C++中的 & 和 * 符号详细讲解
1. & 符号(取地址符、引用符)
① 取地址符(Address-of Operator)
作用:获取变量的内存地址。
示例:
复制代码
int a = 10;
int* p = &a; // 取变量a的地址,存到指针p中
详细说明:
- 变量名
a
表示变量本身 &a
表示“变量a的地址”,即这个变量在内存中的位置- 赋值给
int* p
(指针)后,指针存储了变量a的地址
2. & 符号(引用)
作用:创建一个引用,也就是某个变量的别名。
示例:
复制代码
int a = 20;
int& ref = a; // ref 是 a 的引用
ref = 30; // 其实就是修改 a 的值
说明:
ref
和a
指向同一个内存位置- 引用必须在定义时初始化,之后不能指向别的变量
- 引用常用于函数参数或返回值,避免复制,提高效率
二、C++中的 * 符号(解引用符和声明指针变量)
1. 解引用操作符(Dereference Operator *
)
作用:通过指针访问指向的变量。
示例:
复制代码
int a = 10;
int* p = &a; // 指针p存变量a的地址
std::cout << *p; // 通过解引用访问a的值,输出10
说明:
*p
表示“取p指向的内容”- 只有指针在指向合法地址时,使用
*
解引用才有效,一旦指针为空或指向无效地址会引发错误
2. 声明指针变量
示例:
复制代码
int* p; // 声明一个指向int的指针
p = &a; // 指针存变量a的地址
注意事项:
*
在声明时表示“指针类型”- 指针声明的语法:
类型* 变量名;
三、指针和引用的比较总结
特性 | 指针 (* ) | 引用 (& ) |
---|---|---|
是否可为空 | 可以空(指向NULL或nullptr) | 不可空(必须初始化且不可改变) |
重新绑定 | 可以改变指向 | 绑定后不能变 |
语法使用 | 需要解引用:*p | 类似变量:ref |
常用场景 | 需要指向多个不同对象或动态管理 | 作为参数传递,确保引用传递 |
四、C++中的 .
和 ->
1. .
(成员访问操作符)
作用:访问对象(实例或结构体)中的成员。
示例:
复制代码
class Person {
public:int age;
};Person p;
p.age = 25; // 使用 '.' 访问成员
2. ->
(成员访问指针操作符)
作用:通过指向对象的指针访问成员。
示例:
复制代码
Person* pPtr = &p;
pPtr->age = 30; // 等价于 (*pPtr).age = 30;
总结:
- 使用对象实例时,用
.
- 使用指针时,用
->
五、this
指针和成员访问
在类的方法中,this
指针指向调用该方法的对象。用以区分成员变量和参数或局部变量,或者返回对象自身。
1. this->
的使用场景
- 当成员变量和参数或局部变量名字相同时,用
this->
明确指向成员。
示例:
复制代码
class Person {
public:int age;void setAge(int age) {this->age = age; // 区分参数和成员变量}
};
2. this.
与 this->
?
- 通常在类的非静态成员函数中,
this
为指针,访问成员用this->成员
this.
是没有的,this
是指针,用于解引用(不常用)
总结:
- 一般用
this->
来访问成员,特别是在参数名与成员变量相同时
六、总结详解
&
操作符:- 获取变量的地址(取地址)
- 定义引用,作为某变量的别名(引用类型)
*
操作符:- 解引用指针,访问指针指向的变量
- 在声明中定义指针类型(
int* p
)
成员访问符:
.
:实例对象访问成员->
:指针访问成员(指针->成员
等价于(*指针).成员
)
this
指针:- 类成员函数中,指向调用对象
- 常用在区分成员变量和局部变量或参数
举个完整示例串联理解
复制代码
#include <iostream>
using namespace std;class Person {
public:string name;int age;void setData(string name, int age) {this->name = name; // 用this->区分成员变量和参数this->age = age;}void showData() {cout << "Name: " << this->name << ", Age: " << this->age << endl;}
};int main() {Person p;p.setData("Alice", 25); // 通过对象调用成员函数p.showData();Person* pPtr = &p; // 指针指向对象pPtr->setData("Bob", 30); // 指针调用成员函数(用 ->)pPtr->showData();int num = 100;int* pNum = # // 指针存地址cout << "num的地址: " << &num << endl; // 取地址cout << "pNum指向的值: " << *pNum << endl; // 解引用,访问值int& ref = num; // 引用变量ref = 200; // 改变引用,实际就是改numcout << "num的值: " << num << endl;return 0;
}
最后一点建议
理解这些符号的关键在于:
- 多练习动手写一些小程序,试着用指针、引用、成员访问符
- 观察输出,理解变量的内存布局和指针的关系
- 记住
&
既可以取地址,也可以定义引用,看上下文区分