原文出处

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

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

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. docker 把容器commit成镜像

    该方法是使用docker commit 命令,其命令格式为:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 主要参数选项包括: -a ,– ...

  2. selenium 之Ran 0 tests in 0.000s

    from selenium import webdriverfrom time import ctime,sleepimport unittestclass TestLogin(unittest.Te ...

  3. ionic3 cordova 调取软键盘

    应用场景,因为兼容ios,安卓问题,不能直接调用激活软键盘方法.只有在点击按钮时让input框自动获取焦点,激活软键盘.然后把input框定位在键盘上方,软键盘激活可以监听到键盘高度. 先下载keyb ...

  4. vue相关问题在工作中的问题及ui组件及html样式搭建相关网站下载资源

    https://youzan.github.io/vant/#/zh-CN/nav-bar http://www.builive.com/docs/api/index.html    bui框架BUI ...

  5. Orcale 之基本术语一

    数据字典 数据字典是 Orcale 的重要组成部分.它有一系列的拥有数据库元数据信息的数据字典表和用户可以读取的数据字典视图组成,存放着数据库的有关信息.因此数据字典可以看作一组表和试图的集合.它们存 ...

  6. SpringMVC的数据回现

    一.什么是数据回显 数据提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面. 二.pojo数据回显方法 1.springmvc默认对pojo数据进行回显. pojo数据传入controller ...

  7. 关于vue的常识问题及解决方法

    一.VSCode开发必备插件 1.Beautify:语法高亮: 2.Bracket Pair Colorizer :对括号对进行着色: 3.ESLint:ESLint插件,高亮提示: 4.HTML C ...

  8. online contest

    http://atcoder.jp/contest https://nanti.jisuanke.com/contest http://codeforces.com/ https://www.nowc ...

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

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

  10. docker安装Ghost博客

    1.安装docker-compose curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose ...