原文出处

复习数据结构的时候看到指针的引用,两年前学的细节确实有点想不起来,于是查了一下网上的资料,并且自己实践了一下,总结了一句话就是:

指针作为参数传给函数,函数中的操作可以改变指针所指向的对象和对象的值,但函数结束后还是会指向原来的对象,若要改变,可用指针的指针或者指针的引用。

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 = &num;
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的更多相关文章

  1. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  2. C++指针参数引用

    粘个代码占位置,以后有时间把指针函数,函数指针都补上 #include <iostream> using namespace std; void freePtr1(int* p1){ /* ...

  3. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  4. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  5. C++学习笔记 指针与引用

    指针与引用  1. 指针 (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空 (2) 指针可以为空,在声明定义时可以不初始化 (3) 指针在初始化之后可以重新指向其 ...

  6. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  7. c++指针与引用问题

    本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #inc ...

  8. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  9. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

随机推荐

  1. (转)Shell常用的特殊位置参数变量说明

    Shell常用的特殊位置参数变量说明 原文:http://m.blog.itpub.net/15498/viewspace-2151142/ $0    获取当前执行的shell脚本的文件名,如果执行 ...

  2. JavaScript Ajax 实现学习

    创建异步对象: function createXmlHttp(){ var xhobj=false; try{ xhobj=new ActiveXObject("Msxml2.XMLHTTP ...

  3. ES6基本语法之let和const

    1.var可以重复声明 var a = 12; var a = 5; alert(a) //5 2.var无法限制修改 如:PI = 3.1415: 3.var没有块级作用域 { } 像: if(){ ...

  4. 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16

    一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...

  5. C++的引用本质上等同于C的指针

    本文给出一个很小的例子,通过反汇编后观察认为,C++的引用本质上等同于C的指针. o foo1.cpp v.s. foo2.cpp o 对foo1.cpp 和foo2.cpp进行编译 $ g++ -g ...

  6. 下面我将随机抽取一名幸运女生,XXXXX

    个人在经过长久以来(约等于4小时)的奋战,终于实现了一个上课老师提问并抽奖的小程序.希望这个程序变得非常非常实用 课程的理解:在我的项目开始之前,先学习了一下UML项目类图的画法,和类与类之间的关系. ...

  7. 使用webgl(three.js)搭建一个3D智慧园区、3D建筑,3D消防模拟,web版3D,bim管理系统——第四课

    序:这段时间忙于奔波,好久没有更新了,今天更新一下,继续上节课的完善讲解,算是对前段时间的一个总结吧.披星戴月的时光也算有点应用效果了. 对于webgl(three.js)性能这一块我在上节课< ...

  8. IT自由职业者的第一个月(上)——何去何从

         2016年8月11号,我终于走完所有流程,拿到了离职证明,5年的嵌入式驱动开发工程师的职业生涯就此结束.走离职流程期间,陆续有同事和朋友问我,离职后去哪儿,我都是告诉他们:“还没想好,离了再 ...

  9. Change - Why we need coding standards

    Change - Why we need coding standards I have the idea of coding standards when I have to review my t ...

  10. 文档类型DTD,DOCTYPE和浏览器模式

    出处:http://blog.csdn.net/freshlover/article/details/11616563 浏览器从服务端获取网页后会根据文档的DOCTYPE定义显示网页,如果文档正确定义 ...