原文出处

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

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

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. TensorFlow模型转为caffe模型

    最近由于要将训练好的模型移植到硬件上,因此需要将TensorFlow转为caffe模型. caffe模型需要两个文件,一个是定义网络结构的prototxt,一个是存储了参数的caffemodel文件. ...

  2. SqlServer索引优化 查看碎片情况

    本文引自 DBCC DBREINDEX重建索引提高SQL Server性能 查看碎片情况使用  dbcc showcontig 函数来进行 代码: --改成当前库 use DB_Name --创建变量 ...

  3. Oracle运算符收录(易忘记,但是又很重要的运算符)

    Create Table Test6( id ), name ), age ), sex ) ) 1. ||   符 字符串连接字符串,注意:文字和日期一定嵌入在单引号里面 select ID,Nam ...

  4. python+requests抓取页面图片

    前言: 学完requests库后,想到可以利用python+requests爬取页面图片,想到实战一下.依照现在所学只能爬取图片在html页面的而不能爬取由JavaScript生成的图片,所以我选取饿 ...

  5. selenium+Python(事件)

    1.操作测试对象前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个元素进行操作.鼠标点击或者键盘输入,这要取决于我们定位的是按钮还输入框.一般来说,webdriver 中比较常用的操作 ...

  6. 010-JedisUtils工具类模板

    redis.properties配置文件 redis.maxIdle=30 redis.minIdle=10 redis.maxTotal=100 redis.url=192.168.204.128 ...

  7. java.security.MessageDigest的使用之生成安全令牌!

    时候,我们需要产生一个数据,这个数据保存了用户的信息,但加密后仍然有可能被人使用,即便他人不确切的了解详细信息... 好比,我们在上网的时候,很多网页都会有一个信息,是否保存登录信息,以便下次可以直接 ...

  8. React项目的打包

    1.create-react-app 来自Facebook官方的零配置命令行工具.create-react-app是来自于Facebook出品的零配置命令行工具,能够帮你自动创建基于Webpack+E ...

  9. 【转】HttpWebRequest 保持session

    通过HttpWebRequest获取网页内容并保持session,最主要的就是存储cookie.这里使用了一个静态变量m_Cookie用来存储cookie的内容.第二次请求网页的时候把cookie传送 ...

  10. no jpeg in java.library.path;java.lang.NoClassDefFoundError: Could not initialize class sun.awt.image.codec.JPEGImageEncoderImpl

    no jpeg in java.library.path;java.lang.NoClassDefFoundError: Could not initialize class sun.awt.imag ...