当前位置: 首页 > news >正文

和 *,以及 -> 和 .

这两个符号——& 和 *,以及 -> 和 . 在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 = &num;                 // 指针存地址cout << "num的地址: " << &num << endl;    // 取地址cout << "pNum指向的值: " << *pNum << endl; // 解引用,访问值int& ref = num;                   // 引用变量ref = 200;                        // 改变引用,实际就是改numcout << "num的值: " << num << endl;return 0;
}

最后一点建议

理解这些符号的关键在于:

  • 多练习动手写一些小程序,试着用指针、引用、成员访问符
  • 观察输出,理解变量的内存布局和指针的关系
  • 记住 & 既可以取地址,也可以定义引用,看上下文区分
http://www.dtcms.com/a/277993.html

相关文章:

  • C语言基础知识--柔性数组
  • 串口学习和蓝牙通信HC05(第八天)
  • LlamaIndex 检索器 Retriever
  • 题目V^V
  • 008_Claude_Code开发工具
  • 自注意力机制及其与早期注意力机制的区别
  • C++高频知识点(十)
  • Android 响应式编程完整指南:StateFlow、SharedFlow、LiveData 详解
  • 封装---统一封装处理页面标题
  • 关于 java:11. 项目结构、Maven、Gradle 构建系统
  • DAY02:【ML 第一弹】KNN算法
  • Datawhale AI夏令营——用AI预测新增用户学习笔记
  • 【VLLM】大模型本地化部署
  • 【图片识别内容改名】用图片的内容改图片文件的名字,批量OCR识别图片上的文字并同时进行批量改名的操作步骤和注意事项
  • 深入了解JAVA中Synchronized
  • MD5算法深度剖析与可视化解析
  • Kubernetes集群安装
  • Codeforces Round 1032 (Div. 3)(A-G)
  • 嵌入式 Linux开发环境构建之安装 Samba
  • Wireshark的安装和基本使用
  • C语言---自定义类型(上)(结构体类型)
  • Vue Router 完全指南:从入门到实战,高效管理前端路由
  • C++高频知识点(十二)
  • 【LeetCode数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
  • 通信原理与USRP :PSK的调制解调(BPSK、QPSK、16PSK) 文本、图片
  • Struts2框架对重定向URL处理不当导致的OGNL注入漏洞(s2-057)
  • 【LeetCode 热题 100】105. 从前序与中序遍历序列构造二叉树——(解法二)O(n)
  • SSE连接错误机制处置
  • lvs负载均衡实操模拟
  • docker高级管理——Compose容器编排与私有仓库