** 的疑惑??

delphihero 2002-05-20 01:34:56
如 swap(int** i,int** j){int *temp;temp=*i;**i=**j;**j=*temp} 交换 int i,j;的 int *pj,*pj;pj=&j;pi=π 如果调用swap(&pi,&pj) 会交换 i,j 地址里面的值,而调用 swap(pi,pj)则只交换 pi,pj 内的地址,why?? 环境 vc6
...全文
114 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphihero 2002-05-30
  • 打赏
  • 举报
回复
thanks.
原来给的 swap()就是取得模板引用。
delphihero 2002-05-29
  • 打赏
  • 举报
回复
我在 vc.net 中通过的.vc6 中也可以通过,不能用 <iostream.h> 要用新的#include <iostream>
using namespace std;//stl 库
这样就可以编译通过,不用 std;是通不过编译的。
Juventus 2002-05-29
  • 打赏
  • 举报
回复
你是如何在vc6中编译通过的,有特殊选项吗?
我试了一下不行啊,奇怪??
Juventus 2002-05-29
  • 打赏
  • 举报
回复
进入调试态,alt+8,就行了
opengl3d 2002-05-29
  • 打赏
  • 举报
回复
int **i
指向指针的指针
delphihero 2002-05-29
  • 打赏
  • 举报
回复
怎么看程序汇编代码的。
Juventus 2002-05-29
  • 打赏
  • 举报
回复
唉,delphihere你早说嘛,以后建议你把情况说明白一点

使用using namaspace std后,整个std名字空间都开放了
当调用swap(pi,pj)时,调用的是std::swap()
因为你自己定义的swap()函数参数不匹配

这是我在vc6下摘录的部分汇编
没有使用using namaspace std:
30: swap(&pi, &pj);
004010B2 lea edx,[ebp-10h]
004010B5 push edx
004010B6 lea eax,[ebp-0Ch]
004010B9 push eax
004010BA call @ILT+0(swap) (00401005)
004010BF add esp,8

当使用using namaspace std后:
23: swap(pi, pj);
004012F2 lea edx,[ebp-10h]
004012F5 push edx
004012F6 lea eax,[ebp-0Ch]
004012F9 push eax
004012FA call @ILT+5(std::swap) (0040100a)
004012FF add esp,8
可以看出call的是std中的swap(),巧的很std中也swap()这个函数
因为它是个template,所以可以匹配pi,pj做参数
同时在main()中调用swap(&pi, &pj)时,匹配的是你自己定义的那个函数
如果你把你的函数名改掉,在编译运行一下就明白了


delphihero 2002-05-28
  • 打赏
  • 举报
回复
你的两个程序有区别吗?
swap(qq,pp); 不是这个!!!!!!!!!!!!
该是 swap(pi,pj) 这个也能运行,即 int *pi,*pj 传给给函数 swap(int** i,int **j) 这样改变地址。
看清楚题目。我只想知道为什么可以如此调用

xiaoluoli 2002-05-28
  • 打赏
  • 举报
回复

#include"iostream.h"
/*为第一种情况void swap(int** i,int** j){
int *temp;
temp=*i;
**i=**j;
**j=*temp;
} */
//第二种情况
void swap(int** i,int** j)
{
int temp;
temp=**i;
**i=**j;
**j=temp;
cout<<"swaped"<<endl;
}

void main(){
int*pi,*pj;
int**pp,**qq;
int i=212,j=65;
pj=&j;
pi=&i;
pp=&pj;
qq=π
cout<<pi<<endl<<pj<<endl;
swap(&pi,&pj);
cout<<i<<endl<<j<<endl<<*pi<<endl<<*pj<<endl;
cout<<pi<<endl<<pj<<endl;
swap(qq,pp);
cout<<pi<<endl<<pj<<endl<<**qq<<endl<<**pp;

}
//交换 int i,j;的 int *pj,*pj;pj=&j;pi=π
//如果调用第一种情况不会交换 i,j的值,
//而调用第二种情况会交换 i,j的值,但两种情况都不改变pi,pj的地址这应该是肯定的
cometofly 2002-05-27
  • 打赏
  • 举报
回复
你所说的swap()函数的调用方式有两种:

1.swap(a,b);
2.swap(&a,&b);

使用第一种方式只是将要交换的值传入函数,函数对这两个值先进行拷贝,
拷贝到a,b变量中,再将a,b变量对换,并没有对原来的数据进行交换;
而第二种方式将变量的地址传入参数,实现了真正的交换;

在Essential C++中有讲过
Juventus 2002-05-27
  • 打赏
  • 举报
回复
delphihero
其实这个问题不用多费脑子了
在vc中(至少) ** 是个类型不安全的东西
也就是说swap(int **i ,int **j)是个类型不安全的原型
所以你两种调用都可以,当然其中有一种是背离你本意的
delphihero 2002-05-27
  • 打赏
  • 举报
回复
在从 int* 到 int** 的转化,正常赋值是不允许的,但在函数中,不知道编译器搞了什么小动作,或者是本该如此转化,但我没有看到任何书籍有记载。奇怪呀!
Maxwell 2002-05-27
  • 打赏
  • 举报
回复
一个*,操作的是变量名,两个*,操作的是(*变量名),你每次分析最左面的一个*就没有问题了。
pploveshao 2002-05-27
  • 打赏
  • 举报
回复
delphihero(阿蒙(C++))
我是用C++Builder 6的,確實是如你所說的結果,我也很奇怪。
void swap(int** left, int** right)
{
int temp;
temp = **left;
**left = **right;
**right = temp;
}

第一種情況
int main(int argc, char* argv[])
{
int i = 10;
int j = 100;
int* pi = &i;
int* pj = &j;
cout << i << " , " << j << endl;
cout << *pi << " , " << *pj << endl;
swap(pi, pj);
cout << i << " , " << j << endl;
cout << *pi << " , " << *pj << endl;
char c;
cin >> c;
return 0;
}
輸出:
10,100
10,100
10,100
100,10
確實是指針交換了

第二種情況
int main(int argc, char* argv[])
{
int i = 10;
int j = 100;
int* pi = &i;
int* pj = &j;
cout << i << " , " << j << endl;
cout << *pi << " , " << *pj << endl;
swap(&pi, &pj);
cout << i << " , " << j << endl;
cout << *pi << " , " << *pj << endl;
char c;
cin >> c;
return 0;
}
輸出:
10,100
10,100
100,10
100,10
step_by_step 2002-05-27
  • 打赏
  • 举报
回复
int **p;表示指向指针的指针,记住了指针也是一个变量,只不过这个变量是存放地址的。所以p是指向存放地址的那个变量的地址
Autom 2002-05-27
  • 打赏
  • 举报
回复
在vc6中这个程序编译通不过呀!有一个报错:cannot convert parameter 1 from 'int*' to 'int **'.你是怎么编译通过的?
delphihero 2002-05-26
  • 打赏
  • 举报
回复
基本的**和*& 我是了解的,但vc在这却转了一个圈子,不知道是不是编译器的问题,在 vc.net 中依然这样。不知道到 c++ builder 这样写能行吗
gzl 2002-05-25
  • 打赏
  • 举报
回复
见鬼!指了两回就蒙了??不会吧,我的程序员。:)
gernal_dn 2002-05-25
  • 打赏
  • 举报
回复
VC的毛病!
swap(pi,pj)是不允许的,而且是危险的,但VC漏掉了!
在VC里连续调试几次后,程序死掉了!!!
jamesfangjing 2002-05-25
  • 打赏
  • 举报
回复
直接得用swap(pi,pj)时,函数内的变量被屏蔽了,所以是传不回来的,我想这个应该明白,即使是一级指针也不可能这样换值!
但是用swap(&pi,&pj)时,就不一样了!实际上就是相当于指针交换一样了,所以就可以传了!
加载更多回复(20)

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧