没有合适的资源?快使用搜索试试~ 我知道了~
首页理解C语言中**p与&p的区别:指向指针的指针与引用指针详解
在C语言中,理解p与*&p之间的差异至关重要,尤其是对于初学者来说。这两种形式分别代表了不同的概念:指向指针的指针和引用指针变量。 p(双星号p)实际上是`*`(取地址运算符)作用于`p`,这表示的是对`p`指向的指针本身的地址进行操作。换句话说,如果你有一个指针`p`指向一个整型变量的地址,p会指向这个地址,即`*p`的地址。在`all1`函数中,`*p`输出的是实际存储的整型数据,而`p`则输出`p`指向的`pp`指针的地址。 另一方面,*&p(星号和与号p)则是引用运算符`&`应用于`p`,这意味着`&p`返回的是指针`p`本身的位置,而不是它所指向的内容。在`all2`函数中,`p`被声明为一个指针的引用,当`p=pp`时,实际上是将`pp`的地址赋给了`p`,因此`p`成为`pp`的一个别名,而非其内容。这里的`cout<<"int*&p:p:"<<p<<endl;`输出的是`p`(即引用)的地址,而不是它指向的数据。 引用有其独特性,它们定义时必须初始化,且不能像指针那样定义数组或指向引用的指针。这意味着在C++中,`int &arr[5];`是不允许的,因为数组不能作为引用。引用还强调了其在内存中的位置不变性,一旦引用了一个变量,就不能改变其指向的对象。 p和*&p的区别在于一个是操作指针的指针,另一个是操作指针变量的引用。理解这两者的区别有助于正确地在C语言中管理内存和指针操作,避免潜在的混乱和错误。通过实例代码演示,我们可以看到这些概念在实际编程中的应用和行为。
资源详情
资源推荐
C 语言学习笔记
1 / 6
指向指针的指针和引用指针变量
-----------------------------------------------------------**p 与 *&p 的差别
声明:以下内容仅为学习的理解,仅供参考!
**p 等价于*(*p),这里,p 就是指向指针的指针,在这里*就是取地址运算
符;*p 是指向 p,p 是指针,*(*p)就是指向*p,*p 也是指针。
*&p 等价于*(&p),这里,p 就是指针变量的引用,在这里&就是引用,引用
就是一个别名,p 就是一个指针变量的别名。
“引用定义时必须初始化,这是它与指针根本的不同”(钱能说的)。
“不能定义引用数组,不能定义指向引用的指针”(谭浩强说的)。
指针就是地址(地址的值),引用就是别名(变量的别名)。&p 出现在赋值
表达式的右边的时候,&肯定是取地址运算符。&p 出现在赋值表达式左边的时
候,&肯定是引用声明符(此时,它不是运算符,是声明符。)
下面用一段程序和程序的运行结果来说明他们的差别。
//指针的引用和指向指针的指针
//Filename:point1.cpp
#include <iostream>
using namespace std;
void all1(int **p)//定义一个函数,函数的参数是一个指向”指向整型变量的指针”的指针
{
int *pp = new int;//给指向整型变量的指针 pp 分配一个整型数据的内存地址
*p = pp;//指针 p 指向的值是 pp(这里 pp 是一个指针,指向整型数据的指针)
//重点说明:pp 是一个地址(指针就是地址),新分配的内存的地址
cout<<"int**p:p:"<<p<<endl;//输出指针 p 的值(就是 p 所指向的地址)
cout<<"int**p:*p:"<<*p<<endl;//输出指针 p 所指向的地址里储存的数据
cout<<"int**p:&p:"<<&p<<endl;//输出指针 p 的地址
}
void all2(int*& p)//定义一个函数,函数的参数是一个指针的引用(或者说:一个指针的别名)
{
int *pp = new int; //给指向整型变量的指针 pp 分配一个整型数据的内存地址
p = pp;//把新分配的内存地址赋值给 p(p 是指针变量的引用(或者说,别名))
cout<<"int*&p:p:"<<p<<endl;// 输出指针 p 的值(就是 p 所指向的地址)
cout<<"int*&p:*p:"<<*p<<endl;//输出 p 所指向的地址里储存的数据
cout<<"int*&p:&p:"<<&p<<endl;//输出 p 的地址
}
int main()
{
int *a1;//定义一个指针 a1(最好用 int *a1=NULL;防止出现野指针)
all1(&a1);//调用函数 all1(),参数是&a1(就是指针 a1 的地址)
//补充说明:函数 all1()的参数就是指向指针的指针(或者说:存放指针的地址)
*a1 = 1;//a1 指向的地址储存的数据是 1
下载后可阅读完整内容,剩余5页未读,立即下载
012huang
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 批量文件重命名神器:HaoZipRename使用技巧
- 简洁注册登录界面设计与代码实现
- 掌握Python字符串处理与正则表达式技巧
- YOLOv5模块改进 - C3与RFAConv融合增强空间特征
- 基于EasyX的C语言打字小游戏开发教程
- 前端项目作业资源包:完整可复现的开发经验分享
- 三菱PLC与组态王实现加热炉温度智能控制
- 使用Go语言通过Consul实现Prometheus监控服务自动注册
- 深入解析Python进程与线程的并发机制
- 小波神经网络均衡算法:MATLAB仿真及信道模型对比
- PHP 8.3 中文版官方手册(CHM格式)
- SSM框架+Layuimini的酒店管理系统开发教程
- 基于SpringBoot和Vue的招聘平台完整设计与实现教程
- 移动商品推荐系统:APP设计与实现
- JAVA代码生成器:一站式后台系统快速搭建解决方案
- JSP驾校预约管理系统设计与SSM框架结合案例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功