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

【C++】指针

*加入JS神教吧,一个没有指针的世界! *

菜鸡传送门
学习 C++ 的指针既简单又有趣。 (真的简单吗?) 通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。

正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:

#include <iostream>using namespace std;int main ()
{int  var1;char var2[10];cout << "var1 变量的地址: ";cout << &var1 << endl;cout << "var2 变量的地址: ";cout << &var2 << endl;return 0;
}

当上面的代码被编译和执行时,它会产生下列结果:

var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6

什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
以下是一些有效的指针声明案例:

int    *ip;    /* 一个整型的指针 */
double *dp;    /* 一个 double 型的指针 */
float  *fp;    /* 一个浮点型的指针 */
char   *ch;    /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。
不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

C++ 中使用指针

使用指针时会频繁进行以下几个操作:定义一个指针变量、把变量地址赋值给指针、访问指针变量中可用地址的值。这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:

#include <iostream>using namespace std;int main ()
{int  var = 20;   // 实际变量的声明int  *ip;        // 指针变量的声明ip = &var;       // 在指针变量中存储 var 的地址cout << "Value of var variable: ";cout << var << endl;// 输出在指针变量中存储的地址cout << "Address stored in ip variable: ";cout << ip << endl;// 访问指针中地址的值cout << "Value of *ip variable: ";cout << *ip << endl;return 0;
}

运行结果

Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

假如我们给一个指针赋予一个新的值会如何?

#include <iostream>using namespace std;int main ()
{int  var = 20;    // 第一个实际变量int  another_var = 30;  // 第二个实际变量int  *ip;         // 指针变量的声明ip = &var;        // 指针指向var的地址cout << "Value of var variable: ";cout << var << endl;cout << "Value of another_var variable: ";cout << another_var << endl;// 输出指针当前存储的地址cout << "\nAddress stored in ip variable (指向var): ";cout << ip << endl;// 访问指针指向地址的值cout << "Value of *ip variable: ";cout << *ip << endl;// 给指针赋予新值(指向另一个变量)ip = &another_var;// 输出指针现在存储的新地址cout << "\nAddress stored in ip variable (指向another_var): ";cout << ip << endl;// 现在访问的是新地址的值cout << "Value of *ip variable now: ";cout << *ip << endl;return 0;
}

此时的运行结果:
在这里插入图片描述
可以发现ip已经代表另外一个变量的地址了。

如果我们试图给指针赋值呢?我的意思是直接赋值,类似我们a=10这样(别告诉我你没这么干过)
运行一下就会发现它报错了!
在这里插入图片描述
反过来想,当我们看见这样的报错时,说明我们错误地使用了指针。

使用指针赋值

如果我们使用指针去赋值呢?

   *ip=10;// 输出指针现在存储的新地址cout << "\nAddress stored in ip variable(2) (指向another_var): ";cout << ip << endl;// 现在访问的是新地址的值cout << "Value of *ip variable now(2): ";cout << *ip << "; another_var=" << another_var << endl;

运行结果:
在这里插入图片描述

http://www.xdnf.cn/news/16585.html

相关文章:

  • 【面试场景题】阿里云子账号设计
  • 【数据结构】用堆实现排序
  • JavaWeb 入门:JavaScript 基础与实战详解(Java 开发者视角)
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • 某雷限制解除:轻松获取原始下载链接,支持多任务转换
  • Hyperchain安全与隐私机制详解
  • Android Slices:让应用功能在系统级交互中触手可及
  • ElasticSearch 的3种数据迁移方案
  • RabbitMQ 消息持久化的三大支柱 (With Spring Boot)
  • 深度学习篇---百度AI Studio模型
  • JSON-RPC 2.0 规范
  • JVM知识点(2)
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • Python 程序设计讲义(28):字符串的用法——格式化字符串:format()方法
  • Spring Boot with RabbitMQ:四大核心模式指南
  • python-网络编程
  • PCIE4.0/5.0/DDR4/DDR5使用以及布局布线规则-集萃
  • RHCE综合项目:分布式LNMP私有博客服务部署
  • 【Lua】题目小练4
  • 【保姆级 - 大模型应用开发】DeepSeek R1 本地部署全攻略:Ollama + vLLM + PyTorch 多选方案
  • 【图像处理基石】如何对遥感图像进行实例分割?
  • 【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • Go 客户端玩转 ES|QL API 直连与 Mapping Helpers 实战详解
  • 11、read_object_model_3d 读取点云
  • 预装Windows 11系统的新电脑怎么跳过联网验机
  • 预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)
  • 三、Linux用户与权限管理详解
  • Redis内存使用耗尽情况分析
  • 编辑距离:理论基础、算法演进与跨领域应用