| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4229 人关注过本帖, 1 人收藏
标题:[求助]二级指针
只看楼主 加入收藏
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 

在我看来LZ的这个程序只是特殊情况


路漫漫其修远兮 吾将上下而求索
2006-04-20 22:35
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
听我一一道来:
首先这不是连续存储的,从理论上你可以把它理解为是连续存储的,但实际物理上它不是连续存储的。
*p是指向i的地址,也就是&i.(假设地址为11111111)
**p又是指向*p的地址。(假设地址为22222222)
void f(int ** p)
{
所以一句*p也就为&i.
cout<<"*p = "<<(long)*p<<endl;
最重要是这一句,
首先++,也就为得到**p所指向的地址,为*p.
然后再用指针取值符*,取得*p的值。也就为*(*P),也就等于49.

*p++;
cout<<"*p = "<<(long)*p<<endl;
}

楼上那位仁兄说这是特殊情况。也太不负责任了吧。

=×&D o I p R e E n C g T l X&×=
2006-04-20 22:56
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 

物理上不是,但在虚地址空间可能是连续的。
试试这个。

#include <iostream>
using namespace std;

void f(int ** p)
{
cout<<"*p = "<<(long)*p<<endl;
*p++;//这个解引用没用,去掉也可以。
cout<<"*p = "<<(long)*p<<endl;

}
int main()
{
int i =49;
int j =50;//加一句。
int * ip = &i;
cout<<"ip = "<<(long)ip<<endl;
f(&ip);

system("pause");
return 0;
}


2006-04-21 11:18
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
我说的不是连续存储是指指针的存储。

=×&D o I p R e E n C g T l X&×=
2006-04-21 11:21
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
以下是引用Bjarne在2006-4-20 22:56:00的发言:
听我一一道来:
首先这不是连续存储的,从理论上你可以把它理解为是连续存储的,但实际物理上它不是连续存储的。
*p是指向i的地址,也就是&i.(假设地址为11111111)
**p又是指向*p的地址。(假设地址为22222222)
void f(int ** p)
{
所以一句*p也就为&i.
cout<<"*p = "<<(long)*p<<endl;
最重要是这一句,
首先++,也就为得到**p所指向的地址,为*p.
然后再用指针取值符*,取得*p的值。也就为*(*P),也就等于49.

*p++;
cout<<"*p = "<<(long)*p<<endl;
}

楼上那位仁兄说这是特殊情况。也太不负责任了吧。

我无法理解这一句“最重要是这一句,首先++,也就为得到**p所指向的地址,为*p.”
确实是先++,但是结果是p向后移动了一个int类型的大小。
这个程序确实特殊。因为内存分配连在一起了。如果在int i的定义后插入其他类型的变量定义,这个程序的执行结果就会不同了吧。


成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-04-21 11:35
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
天啊。。。怎么个个都对指针理解这么。。。。。!!!!

=×&D o I p R e E n C g T l X&×=
2006-04-21 13:09
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 

我无法理解这一句“最重要是这一句,首先++,也就为得到**p所指向的地址,为*p.”


2006-04-21 13:13
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
确实没看到书上像你那样解释的阿。
要不,你给个例子,在int i定义后面再定义一个其他变量,让*p还打印49出来。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-04-21 13:14
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 

#include <iostream>
using namespace std;
void f(int ** p)
{
cout<<"*p = "<<(long)*p<<endl;
(*p)++;//加个扣号后,就能输出地址
cout<<"*p = "<<(long)*p<<endl;

}
int main()
{
int i =49;
int * ip = &i;
cout<<"ip = "<<(long)ip<<endl;
f(&ip);
return 0;
}


路漫漫其修远兮 吾将上下而求索
2006-04-21 13:17
静思
Rank: 3Rank: 3
来 自:沈阳
等 级:新手上路
威 望:8
帖 子:630
专家分:0
注 册:2006-2-28
收藏
得分:0 
指针对一个学习C++的人来说是非常重要的。感觉指针这玩意挺难学的,大家有没有好的办法来学习它?

英者自知,雄者自胜
2006-04-21 13:41
快速回复:[求助]二级指针
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016637 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved