社区
C语言
帖子详情
** 的疑惑??
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
打赏
收藏
** 的疑惑??
如 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
复制链接
扫一扫
分享
转发到动态
举报
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)
1000句最常用口语
- 这些表达常用于表示
疑惑
或不确定性。 - **询问** - *What’s new?*(有什么新鲜事吗?) - *What’s up?*(有什么事吗?) - *Who’s calling?*(是哪一位?) - 这些短语可用于询问对方的近况或是身份等信息。 ...
文言固定句式举例版PPT学习教案.pptx
" 表达的是对能否完成任务的
疑惑
。 - **“奈……何”、“若……何”** 这两个句式则常译为"对……怎么办"或"……该怎么办"。例如,《史记·滑稽列传》中的"巫妪、三老不还,奈之何?" 和《史记·项羽本纪》中的"虞姬...
八年级上英语语法归纳PPT学习教案.pptx
此外,它也可以表示惊讶或
疑惑
,如"How should I know?"(我怎么会知道?) - **应用场合**:在长辈对晚辈的教导中,如"You should be here with clean hands"(你应该洗手再来),或是提出建议,如"You should go ...
初二英语上课文复习PPT学习教案.pptx
- **表达意外或
疑惑
**:`should`还可以表示惊讶或不理解,比如"How should I know?"(我怎么知道?) - **提出建议**:在建议别人时,如"You should go to the doctor if you feel ill."(如果你感觉不舒服,你...
你必须知道的495个C语言问题
5.14 为什么有那么多关于空指针的
疑惑
?为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为...
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章