精华内容
下载资源
问答
  • 指针引用

    千次阅读 2006-10-25 11:31:00
    在下列函数声明中,为什么要同时...本文试图通过一些实际的指针使用经验来解释这个问题。 仔细看一下这种声明方式,确实有点让人迷惑。在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢?。

    在下列函数声明中,为什么要同时使用*和&符号?以及什么场合使用这种声明方式?  

       void func1( MYCLASS *&pBuildingElement );

       论坛中经常有人问到这样的问题。本文试图通过一些实际的指针使用经验来解释这个问题。

       仔细看一下这种声明方式,确实有点让人迷惑。在某种意义上,"*"和"&"是意思相对的两个东西,把它们放在一起有什么意义呢?。为了理解指针的这种做法,我们先复习一下C/C++编程中无所不在的指针概念。我们都知道MYCLASS*的意思:指向某个对象的指针,此对象的类型为MYCLASS。 void func1(MYCLASS *pMyClass);  

      // 例如: MYCLASS* p = new MYCLASS;

       func1(p);

       上面这段代码的这种处理方法想必谁都用过,创建一个MYCLASS对象,然后将它传入func1函数。现在假设此函数要修改pMyClass: void func1(MYCLASS *pMyClass)

       {
       DoSomething(pMyClass);
       pMyClass = // 其它对象的指针
       } 

       第二条语句在函数过程中只修改了pMyClass的值。并没有修改调用者的变量p的值。如果p指向某个位于地址0x008a00的对象,当func1返回时,它仍然指向这个特定的对象。(除非func1有bug将堆弄乱了,完全有这种可能。)

      现在假设你想要在func1中修改p的值。这是你的权利。调用者传入一个指针,然后函数给这个指针赋值。以往一般都是传双指针,即指针的指针,例如,CMyClass**。 MYCLASS* p = NULL;

       func1(&p);
       void func1(MYCLASS** pMyClass);
       {
       *pMyClass = new MYCLASS;
       ……
       }  

      调用func1之后,p指向新的对象。在COM编程中,你到处都会碰到这样的用法--例如在查询对象接口的QueryInterface函数中:
    interface ISomeInterface {
       HRESULT QueryInterface(IID &iid, void** ppvObj);
       ……
       };
       LPSOMEINTERFACE p=NULL;
       pOb->QueryInterface(IID_SOMEINTERFACE, &p);  

       此处,p是SOMEINTERFACE类型的指针,所以&p便是指针的指针,在QueryInterface返回的时候,如果调用成功,则变量p包含一个指向新的接口的指针。

       如果你理解指针的指针,那么你肯定就理解指针引用,因为它们完全是一回事。如果你象下面这样声明函数:

       void func1(MYCLASS *&pMyClass);
       {
       pMyClass = new MYCLASS;
       ……
       }  

       其实,它和前面所讲得指针的指针例子是一码事,只是语法有所不同。传递的时候不用传p的地址&p,而是直接传p本身:  

       MYCLASS* p = NULL;
       func1(p);  

       在调用之后,p指向一个新的对象。一般来讲,引用的原理或多或少就象一个指针,从语法上看它就是一个普通变量。所以只要你碰到*&,就应该想到**。也就是说这个函数修改或可能修改调用者的指针,而调用者象普通变量一样传递这个指针,不使用地址操作符&。

       至于说什么场合要使用这种方法,我会说,极少。MFC在其集合类中用到了它--例如,CObList,它是一个CObjects指针列表。
    class CObList : public CObject {
       ……
       // 获取/修改指定位置的元素
       CObject*& GetAt(POSITION position);
       CObject* GetAt(POSITION position) const;
       };  

      这里有两个GetAt函数,功能都是获取给定位置的元素。区别何在呢?

      区别在于一个让你修改列表中的对象,另一个则不行。所以如果你写成下面这样: CObject* pObj = mylist.GetAt(pos);  

      则pObj是列表中某个对象的指针,如果接着改变pObj的值: pObj = pSomeOtherObj;

      这并改变不了在位置pos处的对象地址,而仅仅是改变了变量pObj。但是,如果你写成下面这样: CObject*& rpObj = mylist.GetAt(pos);  

       现在,rpObj是引用一个列表中的对象的指针,所以当改变rpObj时,也会改变列表中位置pos处的对象地址--换句话说,替代了这个对象。这就是为什么CObList会有两个GetAt函数的缘故。一个可以修改指针的值,另一个则不能。注意我在此说的是指针,不是对象本身。这两个函数都可以修改对象,但只有*&版本可以替代对象。 

    展开全文
  • 指针引用故障(空指针解引用)

    千次阅读 2019-01-09 18:52:45
    其中空指针引用故障,也叫空指针解引用是一类普遍存在的内存故障,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元 。当指针指向无效内存地址时对其引用,有可能...

    C语言中的指针机制使得它灵活高效,但由于指针操作不当产生的动态内存错误也有很多,比如内存泄漏(Memory Leakage)、内存的重复释放、空指针解引用(NullPointer Dereference)

    其中空指针引用故障,也叫空指针解引用是一类普遍存在的内存故障,是程序设计语言中一类常见的动态内存错误。指针变量可以指向堆地址、静态变量和空地址单元 。当指针指向无效内存地址时对其引用,有可能产生不可预见的错误,导致软件系统崩溃。空指针引用缺陷可能导致系统崩溴、拒绝服务等诸多不良后果。

     

    展开全文
  • C++ 指针引用 *&

    千次阅读 2019-04-13 17:52:36
    文章目录指针引用的作用示例仅一级指针实现二级指针实现指针引用实现 指针引用的作用 指针引用 *& 可以 替代 二级指针 **; 使用时,更简单; 可以被重新赋值。 示例 如下示例,要求在 func( p)中,m_value值...


    指针引用的作用

    指针引用 *& 可以 替代 二级指针 **
    使用时,更简单;
    可以被重新赋值。


    示例

    如下示例,要求在 func( p)中,m_value值和 参数 p 指代的实际内容值相同;
    且之后 m_value值的改变,会影响 p 的实际内容;

    仅一级指针实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //一级指针参数
    void func(int * p,  int dest)
    {
    	m_value = dest;
    	*p = m_value;
    }
    
    int main(int argc, char *argv[]) {	
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(pn, 77);
    	cout << *pn <<endl; //经过 func 函数后
    
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    

    输出:

    2
    77
    77
    

    发现 后面改变了 m_value 值 ,并不影响 *pn。 这不合要求

    二级指针实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //二级指针参数
    void func(int ** p, int dest)
    {
    	m_value = dest;
    	*p = &m_value; //*p 表示一级指针 ,指向 m_value 内容的地址
    }
    
    int main(int argc, char *argv[]) {
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(&pn, 77); //pn 是指针变量, &pn 就是二级指针
    	cout << *pn <<endl; //经过 func 函数后
    	
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出:

    2
    77
    88
    

    满足要求。

    指针引用实现

    #include <iostream>
    using namespace std;
    
    int m_value = 1;
    
    //指针引用参数
    void func(int *& p, int dest)
    {
    	m_value = dest;
    	p = &m_value;
    }
    
    int main(int argc, char *argv[]) {
    	int n = 2;
    	int *pn = &n;
    	cout << *pn << endl; //初始值
    	
    	func(pn, 77); //传递一级指针
    	cout << *pn <<endl; //经过 func 函数后
    	
    	m_value = 88;
    	cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出:

    2
    77
    88
    

    满足要求。


    一级指针改变地址(2020.01.30)

    void func(const int *p, int dest)
    {
        m_value = dest;
        p = &m_value;  //直接对一级指针变量p 赋值一个地址。
    }
    
    int main(int argc, char *argv[]) {
        int n = 2;
        int *pn = &n;
        cout << *pn << endl; //初始值
    
        func(pn, 77); //传递一级指针
        cout << *pn <<endl; //经过 func 函数后
    
        m_value = 88;
        cout << *pn <<endl; //改变 m_value 后
    }
    
    

    输出

    2
    2
    2
    

    从结果看,直接改变形参一级指针地址,并不影响实参一级指针。 仅在形参所在函数内部有效。

    展开全文
  • C++指针引用和指向指针的指针传输结构体 #include <iostream> using namespace std; struct teacher { int id; char name[64]; }; int tea(struct teacher* &a) {//指针引用,a是c的别名 a = ...

    C++指针引用和指向指针的指针传输结构体

    #include <iostream>
    using namespace std;
    
    struct teacher {
    	int id;
    	char name[64];	
    };
    
    int tea(struct teacher* &a) {//指针引用,a是c的别名
    	
    	a = (struct teacher*)malloc(sizeof(struct teacher));//a = 开辟的内存,相当于c开辟内存,在写入数据
    	if (a == NULL)
    	{
    		return -1;
    	}
    	a->id = 100;
    	strcpy_s(a->name, "礼仪");
    	return 0;
    }
    
    int tea1(struct teacher **a) {//指向指针的指针指向a(函数的实参)指针的取地址
    	struct teacher *t = NULL;//a=实参的取地址,&a是a(指向指针的指针)的取地址,*a是a指向内存的内容
    	if (a==NULL)             
    	{
    		return -1;
    	}
    	
    	t = (struct teacher*)malloc(sizeof(struct teacher));//理解为某指针指向某地址,指针t = 某指针
    	       
    	//cout << t << endl;//t是一个指针,指向在内存中开辟的一个地址,t=某地址
    	//cout << &t << endl;//&t是t自己的取地址
    	//cout << a << endl;//
    	//cout << *a << endl;
    	//cout << &a << endl;
    	//cout << &(*a) << endl;
    	t->id = 100;	
    	strcpy_s(t->name, "哈哈");
    	*a = t;
    	return 0;
    }
    
    void rea1(struct teacher **a) {
    	if (a==NULL)
    	{
    		return;
    	}
    	struct teacher* t = *a;
    	if (t!=NULL)
    	{
    		free(t);//开辟内存,要释放
    		*a = NULL;		
    	}
    }
    
    void rea(struct teacher *&a) {
    	if (a==NULL)
    	{
    		return;
    	}
    	else
    	{
    		free(a); //开辟内存,要释放
    		a = NULL;
    	}
    }
    
    void main() {
    	struct teacher *c = NULL;//定义一个指针作传输体
    
    	tea1(&c);
    	cout << "id=" <<c->id<<"名字:"<< c->name << endl;//极有可能是*(c->id)
    	rea1(&c);
    	tea(c);
    	cout<< "id=" <<c->id<<"名字:"<< c->name << endl;
    	rea(c);
    }
    
    
    

    效果图:
    在这里插入图片描述

    展开全文
  • 指针引用和二级指针

    2013-10-07 09:20:15
    指针引用:*&top 二级指针:**top top指针可以用指针的引用,也可以用二级指针,都能达到修改top指针的指向的目的。 指针引用:引用就是别名,两个本质上一样,所以直接操作top指针。 二级指针:...
  • swap()交换函数【引用】【指针】【指针引用】 涉及基础知识 C语言的变量,就是将系统分配的地址取个别名,所以变量名就是地址。 引用是一个变量的另一个名字,又称别名。 定义方式: int a=10; int &b=a; ...
  • 一、传指针和传指针引用的区别 相同点: 都是地址的概念。指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。 不同点: 1. 指针是一个实体,而引用仅是个别名 2. 引用只能在定义时被初始...
  • 2、指针引用传参被调用函数的指针变量与调用函数的指针变量共用一块空间。 // PointerCite.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; ...
  •   C语言指针基础知识点(四)–通过指针引用数组   C语言指针基础知识点(五)–用数组名作函数参数   C语言指针基础知识点(六)–通过指针引用多维数组 通过指针引用字符串 1. 字符串的引用方式 字符串是存放...
  • 真正搞懂传值引用和传指针引用

    千次阅读 2017-11-23 16:45:32
    通过一个基本原则和两个例子讲述传值引用和传指针引用的区别,并且从系统底层解析这两种调用的区别
  • 当你传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,即可以改变指针所指的内容,又可以改变指针本身, 但传引用主要是它不生成临时变量,不进行返回值copy等,速度快。 指向常量...
  • 这是做了一个分别使用二重指针和指针的引用带回函数处理结果的例子,左边图使用二重指针,右边图使用指针引用。可以看出来就这个问题来说,使用指针引用简单。但是对于纯C语言的代码,没有引用的概念,就不可用了。 ...
  • 指针数组数组传参、指针引用传参

    千次阅读 2016-09-17 23:47:02
    指针和数组作为参数传入函数时,传入...),我们无法对指针和数组的地址进行操作(如:地址赋值,分配内存等),要进行地址操作需要使用指针引用或指针的指针。 示例: int main() { int i = 1; int *p = &i;
  • C++中指针*与指针引用*&的区别说明

    千次阅读 多人点赞 2019-05-09 16:20:18
    (指针引用)与*(指针)的区别 *指针是一个存放地址的变量,指针引用指的是这个存放地址的变量的引用。 C++中如果参数不是引用的话,会调用参数对象的拷贝构造函数, 所以如果有需求想改变指针所指的对象即想要改变指针...
  • 1.数组指针:即指向数组的指针 ...2.通过指针引用数组元素的基本方法 (1)小标法:a[i]。 (2)指针法:* (a+i) 或 * (p+i) 或 p[i]。其中,a是数组名,p=a,p是指向数组元素的指针变量。 问:为什么*
  • 值接受者可以给接收值、也可以接收指针,因为go会对接收的指针进行解引用。但是!variable传递进函数的只是副本,他们都是在variable的副本上进行操作,并不影响variable的原本的值。 2.指针接受者: (variable...
  • oc中的对象都是使用指针引用的,若没有指针的引用,对象会被自动销毁 在书里看到这句话。 加入我有个对象 [[Person alloc]init]; 我不用指针去引用它,是不是走到下一步它就会被销毁?
  • 指针引用 gcc与g++

    千次阅读 2012-03-17 22:52:33
    今天碰见一个问题,那就是用指针引用时,用gcc编译居然出错了!代码如下: 编译过程如下: 对于这个错误,这是因为c语言不支持指针引用 可以通过返回指针或者使用指向指针的指针来解决相应的问题!
  • Golang struct 指针引用用法 一、前言 入门篇,只包括声明内容,基础的赋值 和 修改值。 个人总结:在 变量访问 struct 结构体时,共有5种不同的方式定义 指针结构体。 个人术语: 结构体内:struct 具体的变量实例...
  • 指针引用作参数和指针做参数的区别???? 2012-10-24 17:17dingba12345 | 浏览 1626 次  网络 void f(int *p)和void f(int *&rp)有什么区别? 我知道rp不占内存空间,只是实参的别名,对rp的改变就是...
  •   在区别分析指针(ElementType *e)和指针引用(ElementType *&e)之前先来明确一下概念: 指针:   指针利用地址,它直接指向存在电脑存储器中某一地址。由于通过地址能找到所需的变量单元,可以说,地址指向...
  • 指针无须在定义时赋值,指针是一个对象 ,因为引用没有实际的地址,所以不能定义指向引用指针 int i, &a=i;| int *p = a;//是错误的,因为a是一个引用指针不能定义指向引用 一般情况指针指针指向的对象...
  • c语言_指针引用数组元素并打印输出

    千次阅读 2016-07-22 20:04:48
    c语言_指针引用数组元素并打印输出 #include void main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4]; int row,col; p=a; /*指针p指向元素为4的数组*/ /*打印输出数组指针p指向的...
  • 通过指针引用数组

    千次阅读 2018-06-13 20:49:32
    1、指针是什么? 为了说清楚什么是指针,必须先弄清楚数据在内存中是如何存储的,又是如何读取的。 如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。编译系统根据程序中定义的...
  • 指针引用最大的区别,指针是开辟了一块内存空间,实实在在存在的,寻得到,而引用是给原有的内存空间起一个别名。对计算机来说变量只不过是一堆地址和该地址的值。 先来看没有函数的写法 #include<stdio.h> ...
  • #include &lt;iostream&gt; using namespace std; int g = 300; void print(int p, int q) { cout &lt;&lt; p &...* 1....p 定义一个指针引用,既可以改变指针指向的内容,...
  • //交换两个字符串--指针引用 //由于swap函数是指针引用,因此传入函数的就是实参,而不是形参 void swap(char *&x,char *&y,const string print="指针引用法") {  cout  char *p;  p=x;  x=y;  y=p;
  • 指针 引用 c++ java的使用总结. ///////////////一般一个变量包括下面的信息 a.地址(指针) b。命名(引用,别名) c.变量内容.. 指针是一个变量的地址,引用是一个变量的别名。 1. 指针是一个地址...
  • 结构体拷贝 先声明一个狗狗的结构体 type Dog struct { name string age int8 } // 重写String接口 func (Dog *Dog) String()...可以看到输出的时候并没有用到重写的String方法(毕竟不是指针) func main() { d1 := D
  • 在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变。那么能够通过传指针改变指针所指向的地址吗?在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&p) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,177
精华内容 22,870
关键字:

指针引用