原文出处

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

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

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. git遇到的常见错误整理

    远程仓库与本地代码不一致 解决: git pull --rebase git@gitee.com:l544402029/MUTAO.git 将仓库里的代码pull下来  ,然后重新进行git add ...

  2. 20190430-BootstrapのJS插件

    目录 1.引用 2. 内容 1.引用 引用该插件需注意俩点 1.1插件依赖JQ:JQ必须在所有插件之前,bower.json内列出BT所支持的JQ版本(1.9.1-3) BootCDNのJQ    J ...

  3. 【云计算~Pig】一、基本语法

    加载与存储 LOAD 将数据从外部文件或其它存储中加载数据,存入关系 STORE 将一个关系存放到文件系统或其它存储中 DUMP 将关系打印到控制台 过滤 FILTER 从关系中删除不需要的行 DIS ...

  4. React 的 server render 初步学习

    所谓server render 即服务端渲染,这是为了解决现代前端框架下的单页应用在SEO方面不友好的问题. react 的SSR主要思路就是 1.将应用的根组件导出 如 <App /> ...

  5. Python ImportError: No module named 'requests'解决方法

    前言:最近在学习python,安装了python3.5的环境后,在网上下载了一个python文件运行的时候,提示ImportError: No module named 'requests'(找不到r ...

  6. step4: Xpath的使用

    XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 包含一个标准函数库. XPath 是一个 W3C 标准. 语法简介: htt ...

  7. Firebird Internal Function

    火鸟自定义内置函数,方便.强大. 特点:只可以返回单值,不能返回多行. 若想返回多行table,可以定义存储过程 Procedure,用suspend返回. 自定义内置函数,示例:返回当前批次号. c ...

  8. SqlServer function 函数

    SqlServer的数据库Tsql还是很强大,以此来纪念下表值函数的语法吧. -- ============================================= -- Author: & ...

  9. CSS基础知识---浮动,定位和盒模型

    转载请注明出处! 需要掌握的三个最重要的CSS概念是浮动,定位和盒模型. 盒模型概述: 页面上的每个元素都被看做一个矩形框(元素框or盒模型),这个框由元素内容,内边距,边框和外边距组成. 内边距出现 ...

  10. 静态代码块,构造代码块,main()

    静态代码块 随Class 加载而加载,为Class 作初始化: 在main() 之前加载: 只执行一次: 构造代码块 随对象的创建而加载,为对象作初始化 public class day04 { pu ...