首页 > 学技术 > 技术网文 > C/C++ > 正文

[保留] 请问void Intset(struct set *&p)里面的"*&p"怎么解释啊?


来源 chinaunix.net kuqin整理

我在看数据结构的集合的一段程序的时候看到这样一段程序

void Intset(struct set *&p,struct set *&q,struct set *&r){
                struct set *k,*m,*n;
        r=(struct set *)malloc(sizeof(set));
        r->next=NULL;
        m=p->next;
        for(;m;){
                n=q->next;
        for(;(m->coef!=n->coef)&&n->next;){
                n=n->next;
        }
        if(!n->next&&(m->coef!=n->coef)) {
                        k=(struct set *)malloc(sizeof(set));
                        k->next=r->next;
                    r->next=k;
                        k->coef=m->coef;
                }
        m=m->next;
        }        
}
.....
struct set *p,*q,*r;
.....
Addset( p,q,r);printf("A∪B:\n");printlist_p(r);break;
...


怎么也理解不了*&p是什么意思。。。
请问这个该怎么理解一下啊。。。



 converse 回复于:2006-12-22 22:21:53

指向指针的引用。


 langq235 回复于:2006-12-22 22:32:18

请问这样做有什么意义么?有没有其他的解释方法?比如比较容易理解的方法,还请不吝赐教~
另外,他指向的是指针,那么函数中的P就是指针的地址,指针的地址怎么指向指针指向的值啊?

[ 本帖最后由 langq235 于 2006-12-22 22:33 编辑 ]


 cjaizss 回复于:2006-12-22 22:41:45

首先这是C++语法,不是C语法。
再者,这是一个指针的引用

#cat 1.cc
#include  <iostream>
using namespace std;
void func1(int* p)
{
      p++;
}
void func2(int* &p)
{
     p++;
}
int main()
{
      int a[2]={1,2};
      int *p1=a,*p2=a;
      func1(p1);
      func2(p2);
     cout << *p1 << "," << *p2 <<endl;
     return 0;
}
#g++ 1.cc
#./a.out
1,2


[ 本帖最后由 cjaizss 于 2006-12-22 22:53 编辑 ]


 langq235 回复于:2006-12-22 22:52:26

为什么我运行结果是1,1?


 cjaizss 回复于:2006-12-22 22:53:04

写错了,我改一下:)


 langq235 回复于:2006-12-22 23:00:36

看不太明白。。^_^,可以讲解一下么,就这俩字符我琢磨一晚上了。。。。
ps:google没法搜索"*"。。。苦涩了。。。


 langq235 回复于:2006-12-22 23:11:15

啊,是不是这个意思?我记得数据结构有讲过对谁修改的话在前面加"&",是不是这个意思?加了&才能真正对参数进行修改?


 cjaizss 回复于:2006-12-22 23:13:34

C++的任何一本基础教程里其实都有。
如果要学C++,这个属于最基础的知识。
我几乎从来不考虑用C++编写代码,或许是因为C++和C比较相近,而思想被禁锢了的缘故吧:)
所谓函数的传入参数,其实在函数的处理过程中,这段内存(也有可能不是内存,可能是register,可能因为做EE的关系,站在硬件的观点上了我就不是特别喜欢说内存这个词了)可能是原来变量的一个copy,无论你在这个函数里如何修改,都影响不到原来的变量。
C也有办法修改原来的变量,那就是传入原来变量的指针。但是或许有的时候看起来比较让人郁闷,于是C++决定改变这个,就用&来代表引用,它操作的对象并不是原来变量的copy,而是真正对原来那个变量进行操作,本质依然是传入那个变量的指针。


 cjaizss 回复于:2006-12-22 23:15:51

&在这里是表示引用,是C++发明的一个标志,不要和C原本那个取地址的&混淆,两者并没有什么关系


 langq235 回复于:2006-12-22 23:21:00

你看看我这么理解的对么?
内存地址
----
a0=1 ff01
----
a1=2 ff02
----
.
.
.
----
p1=ff01 ff0a
----
p2=ff02 ff0b

func1(p1),我向函数传递a0的地址ff01,*p=1;p++的时候没有影响到p1=ff01;
func2(p2),我向函数传递a0的地址ff02,但是函数读取p并取得p的地址ff0b,*&p或者允许我加一个括号*(&p)=ff01,当他自加的时候,影响了ff0b地址的内容,使得*p2=2?


 cjaizss 回复于:2006-12-22 23:31:32

错,func2(p2)实际上传的是p2的地址


 langq235 回复于:2006-12-22 23:40:39

也就是说func2里面的p++就是对p2=ff01自加,也就是指向数组的指针自加,相当于指向数组的下一个元素;

这个"&"还是未能完全理解你刚才的意思,
引用:&在这里是表示引用,是C++发明的一个标志,不要和C原本那个取地址的&混淆,两者并没有什么关系 


只是对指针的引用吧?我刚才尝试了一下引用一个普通的整型变量,出错


 cjaizss 回复于:2006-12-22 23:42:18

&这个符号在这里就表示你现在所操作的就是原来那个变量
你可以把你的常识的代码贴出来吗?


 langq235 回复于:2006-12-22 23:47:43


#include<iostream>
using namespace std;
void func1(int* &p){
   p++;
}

int main(){
   int a=1;
   int *p;            //
   *p=a;            //如果这三段直接修改为func1(a)或者func1(&a)是无法编译通过的,我不太理解,所以都试了试
   func1(p);       //
   count << a << endl;
   return0;
}


以上这段程序可以编译通过,但是显示段错误


 cjaizss 回复于:2006-12-22 23:52:20

...你还是先看看C++的基础教程吧
我很奇怪这段代码居然可以编译通过
count -> cout


 langq235 回复于:2006-12-22 23:54:10

笔误,笔误。。。我用虚拟机编的,在windows下面抄错了~是cout的


 cjaizss 回复于:2006-12-22 23:55:09

另外,为什么会产生段错误,是因为你并没有给p所指向的空间分配“内存”,所谓野指针。


 langq235 回复于:2006-12-22 23:59:06


#include<iostream>
using namespace std;
void func1(int* &p){
   p++;
}

int main(){
   int a=1;
   int *p;            
   *p=a;            
   p=(int *)malloc(sizeof(int));
   func1(p);       
   cout << a << endl;
   return0;
}

这样么?还是不行。。。。cout<<*p也不行。。。


 cjaizss 回复于:2006-12-23 00:04:10


int *p;
*p=a;

这个p值随机,野指针,你根本就不知道它指向谁,怎么能够给它随便赋值?


 langq235 回复于:2006-12-23 00:17:11

嗯嗯。。
#include<iostream>
using namespace std;
void func1(int* &p){
   p++;
}

int main(){
   int a=1;
   int *p;            
   p=&a;   
   func1(p);       
   cout << a << endl;
   cout << *p << endl;
   return0;
}
#1
#-108404839之类的。。没明白啥意思。。。。我这么写*p不就是一个地址了么。。。没修改成a。。。


 hangover 回复于:2006-12-23 02:19:22

试试这个行不?

void func1(int* &p){
   *p++;
}


 hangover 回复于:2006-12-23 02:23:58

是这个

void func1(int* &p){
   (*p)++;
}


 hangover 回复于:2006-12-23 02:54:55

#include <iostream>

void func1(int* &p) { p++; }
void func2(int* p) { p++; }

int main()
{
int n=5;
int *a = new int[n];

for (int i = 0; i < n  ; i++) { a=i; }

int *ptr = a; 
// a  指向 0x003a6110
// ptr  指向 0x003a6110

func2(ptr);
// a  指向 0x003a6110
// ptr  指向 0x003a6110

        a++;
func1(ptr);
// a 指向 0x003a6114
// ptr 指向 0x003a6114

delete [] a;


return 0;
}


 net_robber 回复于:2006-12-23 11:54:27

int &a 
int * a
int *   &a
struct MM *   &a


 denghr 回复于:2006-12-24 20:25:00

当一个指针作为参数传入,而你想改变其值(非其指向的值,而是说指针本身的值),C里面就只能讲此指针再取一次地址 类似 X **的参数形式,C++中,可以用引用 即X * &做到,而且更好理解,否则,只能函数中只能改变指针指向的值而不能改变指针本身的值
 这个问题要是和参数的传递的 by value,by address一起思考就能更好的理解了


 boxpei 回复于:2006-12-25 09:43:06

引用:原帖由 langq235 于 2006-12-23 00:17 发表
#1
#-108404839之类的。。没明白啥意思。。。。我这么写*p不就是一个地址了么。。。没修改成a。。。 



p等于a的地址,a的地址+1之后指向一个未知的地址,这个地址指向的值时未知的,当然会出现你上面列出的那一堆。


 zjzfb 回复于:2006-12-25 17:04:50

引用:原帖由 cjaizss 于 2006-12-22 22:41 发表
首先这是C++语法,不是C语法。
再者,这是一个指针的引用
#cat 1.cc
#include  <iostream>
using namespace std;
void func1(int* p)
{
      p++;
}
void func2(int* &p)
{
     p ... 



也不用如此让人混淆了
一句话:主要是拿来修改指针地址的

#include  <iostream>
using namespace std;

int g_int = 3;

void func1( int* p1 )
{
    p1 = &g_int;
}

void func2( int* &p2 )
{
    p2 = &g_int;
}

int main()
{
    int* p1 = NULL;
    int* p2 = NULL;

    func1( p1 );
    func2( p2 );

    std::cout << p1 << " - " << p2 << std::endl;

    return 0;
}

执行结果应该是p1为0, p2为全局变量g_int的地址

[ 本帖最后由 zjzfb 于 2006-12-25 17:09 编辑 ]


 newsoil 回复于:2006-12-26 17:46:36

2级指针嘛。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=874931
转载请注明作者名及原文出处



收藏本页到: