我在看数据结构的集合的一段程序的时候看到这样一段程序
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级指针嘛。
|