指针的引用-ZZ
复习数据结构的时候看到指针的引用,两年前学的细节确实有点想不起来,于是查了一下网上的资料,并且自己实践了一下,总结了一句话就是:
指针作为参数传给函数,函数中的操作可以改变指针所指向的对象和对象的值,但函数结束后还是会指向原来的对象,若要改变,可用指针的指针或者指针的引用。
ps:对原po的代码稍作修改,看上去更直观些。
#include<iostream>
using namespace std; void foo(int *&t, int *y)//此处是int *t还是int *&t,决定了调用该函数的指针本身会不会被修改。分别跑一下程序即可知。
{
t = y;
//*t = 4;
cout << "foo1:" << t << endl;
cout << "foo2:" << y << endl;
} int main()
{
int num = ;
int num2 = ;
int *p = #
int *q = &num2;
cout <<"p: "<< p << endl;
cout <<"q: "<< q << endl;
foo(p, q);
cout << "after foo" << endl;
cout <<"p: "<< p << endl;
cout <<"q: "<< q << endl;
cout <<"*p: "<< *p << endl;
cout <<"*q: "<< *q << endl;
cout << "************" << endl;
cout<<"num: "<< num<<endl<<"num2: "<<num2<<endl;
}
未加&时: 加了&时

可以看出,未加&时,指针在函数中值被修改(即指向了其他对象),但从函数中返回后仍然指向原来对象(值未被修改)。
而加了&时,指针在函数中值被彻底修改,返回后也是被修改的状态,指向了其他对象。
本质上和一个int a与int& a的区别一样。
===================================================================================================
下面是代码和截图:
1、首先是传递指针
#include<iostream>using namespace std;void foo(int *t,int *y);int main(){ int num = 4; int num2 = 5; int *p = # int *q = &num2; cout<<p<<endl; cout<<q<<endl; foo(p,q); cout<<p<<endl; cout<<q<<endl; cout<<*p<<endl; cout<<*q<<endl; cin>>num;}void foo(int *t,int *y){ t = y; *t = 4; cout<<t<<endl; cout<<y<<endl;} |
q所指向的值改变,但最后p,q都还指向原来的对象

2、传递指针的引用
#include<iostream>using namespace std;void foo(int *&t,int *y);int main(){ int num = 4; int num2 = 5; int *p = # int *q = &num2; cout<<p<<endl; cout<<q<<endl; foo(p,q); cout<<p<<endl; cout<<q<<endl; cout<<*p<<endl; cout<<*q<<endl; cin>>num;}void foo(int *&t,int *y){ t = y; *t = 4; cout<<t<<endl; cout<<y<<endl;} |
函数执行后p和q指向同一对象。

3、指针的指针
差点被绕晕了,指针的引用还好理解,传递参数的时候直接传递指针就好,但是指针的指针就需要把那参数的几种形式理解清楚:t是传递的指针的地址,相当于foo函数中的&y,*t是指针的值,也就是所指向的对象的地址,所以我下面代码里改变他所指向的对象是用*t = y;**t就和*y表示的意思一样了,就是指向对象的值。
#include<iostream>using namespace std;void foo(int **t,int *y);int main(){ int num = 4; int num2 = 5; int *p = # int *q = &num2; cout<<p<<endl; cout<<q<<endl; foo(&p,q); cout<<p<<endl; cout<<q<<endl; cout<<*p<<endl; cout<<*q<<endl; cin>>num;}void foo(int **t,int *y) //t是指针的地址,*t是指针的值,也就是指向的对象的地址{ *t = y; cout<<*t<<endl; cout<<y<<endl;} |

指针的引用-ZZ的更多相关文章
- [速记]关于指针,引用和递归和解递归——C++
在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...
- C++指针参数引用
粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...
- C/C++:提升_指针的指针和指针的引用
C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.
- C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》
C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...
- C++学习笔记 指针与引用
指针与引用 1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...
- 数组类型与sizeof与指针的引用
以char类型为例: char a[100]; //a类型为char[100] &a类型为 char (*)[100] *a类型为char char *p = a; ...
- c++指针与引用问题
本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...
- C++ 中指针与引用的区别
指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...
- 详解c++指针的指针和指针的引用
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...
随机推荐
- SQL语句模糊查询年月
<if test="uploadTime != null" > <![CDATA[ and date_format(w.upload_time, '%Y%m') ...
- Java基础29-子父类中的成员变量
/* 成员: 1.成员变量 2.函数 3.构造函数 变量: this 代表当前对象的引用 this.变量 首先在本类中找所需要的变量,如果没有找到再父类中找. super 用于访问当前对象的父类成员, ...
- Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
简介 最近了解到很多网页开发者对jquery中的 .bind() .live() .delegate() 和 .on() 方法存在很多的疑惑.这些疑惑通常是关于它们之间真正的区别是什么啊,什么时候该使 ...
- (转)最新版 nginx内置变量 大全
原文:http://www.cnphp.info/nginx-embedded-variables-lasted-version.html 在配置基于nginx服务器的网站时,必然会用到 nginx内 ...
- 有意思的shader案例
屏幕水波效果 https://blog.csdn.net/puppet_master/article/details/52975666
- Bootstrap使用模态框modal实现表单提交弹出框
Bootstrap 模态框(Modal)插件 模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等.如果 ...
- [java源码解析]对HashMap源码的分析(一)
最近有空的时候研究了下HashMap的源码,平时我用HashMap主要拿来当业务数据整理后的容器,一直觉得它比较灵活和好用, 这样 的便利性跟它的组成结构有很大的关系. 直接开门见山,先简要说明一下H ...
- 跨平台 GUI可视化 网络调试工具
mNetAssisthttp://blog.chinaunix.net/uid-21977056-id-4310527.htmlhttps://github.com/busyluo/mNetAssis ...
- java 并发(三)---Thread 线程
Thread 的状态 线程共有五种状态.分别是: (1)新建 (2)就绪 (3)运行 (4)阻塞 (5)死亡 ,下面列列举的状态需要结合状态示意图更好理解. 新建状态(New): 新创建了一个线程对 ...
- type=file的change事件只能执行一次的解决方案
最近帮朋友做个项目中遇到了type=file change事件只能执行一次的问题,度娘了一下,发现提供了各种解决方案,所以决定记录一下我的思考方向和最终解决方式. 起初帮朋友做个项目,项目中遇到上传文 ...