社区
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
...全文
210
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写文章
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)
kotlin 泛型out是什么??
本文探讨了Kotlin中的泛型out关键字,解释了它相当于Java中的`? extends 类名`,表示只读模式,允许传入类型为指定类型及其子类的对象。内容包括泛型的定义、限定类型变量、继承规则、通配符类型以及泛型的底层原理。
一维数组地址
疑惑
(有点开脑洞 觉得可以看成三维数组 每个元素是一个??不对。。a[3][1][0]??)
本文深入探讨了C语言中指针与数组的关系,通过具体代码示例解释了指针、数组指针、指针数组的概念及应用。文章详细分析了不同类型的指针变量在内存中的行为,以及它们如何与数组交互。
为什么各行各业都在需要会Python的人??
本文介绍了Python编程语言的基础知识、在金融、咨询和互联网行业的应用,以及其高薪就业前景。强调了Python在各行业的重要性,并提供学习资源和实战案例,鼓励尽早开始学习。,
关于Java对象引用按值引用的想法与
疑惑
本文探讨了Java中对象调用的方式,针对按值调用的特性,提出了两种猜想:一是认为按值调用实际上传递的是对象的引用,类似于C语言中的指针;二是存在一种机制,使得对副本的操作能够同步影响原对象。文章邀请读者共同探讨Java对象调用的实质。
手机是怎么通过4g流量连接到互联网的,继续解决上篇文章--4G模块接入联网的
疑惑
手机通过2G、3G或4G网络连接到移动基站,基站再连接到国际互联网。手机与基站间的通信涉及调制解调、功率放大等技术,数据经过基站转发,最终实现与互联网的数据交换。基站通常使用交流电供电,并有备用电池保障。3.5G(4G)网络提供更快的上网速度。用户需有支持相应技术的手机、手机号及开通上网业务才能使用。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章