| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4237 人关注过本帖, 1 人收藏
标题:[求助]二级指针
只看楼主 加入收藏
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
Bjarne
你的程序之所以为0
是因为那些变量的储存地址中间加了DOUBLE
使&I与&IP地址不是差SIZEOF(INT)而差SIZEOF(INT+DOUBLE)
因此F()里面*P++(下衣SIZEOF(INT))指到了DOUBLE变量里面
因为很不安全
系统自动把P指向0X000000
其内容为0
但总体说变量的储存地址还是连续的

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-22 14:01
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 

不信
你把DOUBLE定义放下面
让I与IP连续定义
结果还是49

请解释的时候少用术语 我才大一有的不懂
谢谢


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-22 14:03
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
我总结了大家的思路:
所谓2级指针**P=&iP;是*P这里表达的是IP的地址,而不是P的内容,因为2级指针加一个*是指向一级指针。*P++是把IP的地址向后移SIZEOF(INT)个单位(P的类型是INT,这就是为什么定义指针需要类型)。
/*int i
int * ip
是连续存储的,p指向ip,p++后指向i了。
IP的地址比I小4个
当*p++
则指&I;既*P=49

平时总结:一般指针与它指向的地址相连(凡是连续定义的,并且在一个内存区,地址都是连续的)
*/
由于IP的地址与I的地址连续,所以*P++之后就指向了I,输出I的数值。为什么不输出地址而输出数值呢?
大家别被2级指针弄晕 因为I是变量呀
INT X=8;COUT〈〈X; 输出的是X数值,不是地址。(系统自动向上面找X是什么类型,是指针才输出地址。或者这么记,输出的总是它储存的内容)
指针的分配就是不连接的。这句话虽然对,但是那是针对系统角度,而我们操作的都是排他之后的内存,因此在我们看来,I和IP是连续的
实际上在P与IP之间有一些不是给程序员看的内存,也就是不连续,里面可能包括其他各种操作或对这个地址类型用途的说明。我还没学。。。。

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-22 15:15
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
我无法理解这一句最重要是这一句,首先++,也就为得到**p所指向的地址(此时P指向了变量),为*p
*p++;
cout<<*p<<endl;
此时相当于COUT<<I<<ENDL;
自然是数值。因为I是变量
COUT输出后面对象的地址表达的内容。(常量其实也有地址,内容是他本身)
而上面cout<<*p<<endl;为什么是地址。
因为此时*P指向(储存IP的地址,也就是*P内容)IP;相当于IP;
也就是cout<<IP<<endl;
理解不了的象这样做一下代换

我以前问过大家COUT的问题 没人理会我的意思 。。。

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-22 15:52
吻舞双全
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-3-27
收藏
得分:0 
一到2级指针就用不好啊
怎么理解好呀
各位帮忙了
2006-04-25 17:06
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用踏魔狼在2006-4-21 14:36:00的发言:

好!
不把你们弄明白,我今儿就不吃饭。
一个*表示另一个指针,再加一个*符表示另一个指针。
也就是两个**的指针指向一个*的指针。(请确定你已经了解。)
**p它是指向*p的。(了解!)
*p是指向&i的。(明白!)
为了更好区分,两个**的指针用B来代替,一个*的指针用A来代替。
*B++;//B原是指向A的地址,++了后就指向A所指向的地址&i.(B->A->&i).
那么再*B也就是取i的值,也就是49了。

这位姐姐解释的已经很详细了
多看看吧


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-26 08:45
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
我想问下,我对2级指针的看法:
一.int i;
int *p=&i;
int **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存i的地址值的变量。
fp++,是说fp向后指一位,那这个位置就是i的地址,是这样吗?

二.如果是数组
char val[]={1,2,3,4,5,6};
char *p=val;
char **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存数组val第一个地址值的变量。
fp++,是什么效果呢?如果是(*fp)++,可以说是相当于p++了,现在怎么解释?

也请帮我看看我哪里的理解出现误解。指出我改正。

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-27 15:26
gototheworld
Rank: 1
等 级:新手上路
帖 子:218
专家分:0
注 册:2006-3-24
收藏
得分:0 
以下是引用wfpb在2006-4-27 15:26:00的发言:
我想问下,我对2级指针的看法:
一.int i;
int *p=&i;
int **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存i的地址值的变量。
fp++,是说fp向后指一位,那这个位置就是i的地址,是这样吗?
所先,
1。你要明白变量在内存中,是由高位向底位存储的。
2。指针的存储类型是整型。
好了,明白这点我们来看一下问题:fp++是什么意思呢?fp是整形(见2),fp++表示fp指向向后移动4(见2,因为他是整形吗,所以就是4)个字节的内容。那这个内容是什么呢?等一下再回答。int i;假设i的存储地址是0012FF7C,int *p=&i;后p的存储地址就是0012FF78(见1,还有他们是连系存储的),int **fp = &p;后,现在来回答刚才的内容是什么。fp的值是0012FF78,在fp++后,fp向后移动四个字节,即0012FF78加4个字节,那就是0012FF7C了,哈哈你可以发现正是变量i的地址,所以你这时cout<<*fp;就是变量i的值。注意:这里还有一个小的细节,fp移动后,你没有给他说明移动后指向的类型,所以上面的cout语句,最好要改成cout<<*(int*)fp;

二.如果是数组
char val[]={1,2,3,4,5,6};//这里错了,为什么不这么写呢:char val[]={'1','2','3','4','5','6'}
char *p=val;
char **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存数组val第一个地址值的变量。
fp++,是什么效果呢?如果是(*fp)++,可以说是相当于p++了,现在怎么解释?

你的第一个问题同上。

第二个问题:*fp的值是val吧,即数组第一个元素的地址。*fp是char类型变量的地址,那么(*fp)++就是*fp向后移动一个char单位,就是数组的第二个元素的地址了。

路漫漫其修远兮 吾将上下而求索
2006-04-27 17:37
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
以下是引用wfpb在2006-4-27 15:26:00的发言:
我想问下,我对2级指针的看法:
一.int i;
int *p=&i;
int **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存i的地址值的变量。
fp++,是说fp向后指一位,那这个位置就是i的地址,是这样吗?

二.如果是数组
char val[]={1,2,3,4,5,6};
char *p=val;
char **fp=&p;
那么fp应该是一个保存指针p地址值的变量,p是一个保存数组val第一个地址值的变量。
fp++,是什么效果呢?如果是(*fp)++,可以说是相当于p++了,现在怎么解释?

也请帮我看看我哪里的理解出现误解。指出我改正。

fp++ 那就向下移动4个储存单位 因为fp所储存的单位是指针,fp++就会移动sizeof(p);
移动多少看它储存单位是什么
不过你这么写会出现错误 因为fp下移sizeof(p)个单位 使fp与*fp所指向的地址相同
同样很不安全 系统就会把*fp中间这步省略.让fp直接指向*fp的内容.也就是数组的地址
而*fp被系统自动放到一个未名区域.
如果是(*fp)++;下移sizeof(p);就是p移到'2'那里
其他的不变
只要记住 &fp是2级指针地址 fp=&p一级指针的地址 *fp=&val一级指针地址内的内容也就是数组地址


嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-04-27 20:39
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

这里的(long)有什么作用?强制类型转换?本来是地址0x31,转换以后49?


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-28 14:04
快速回复:[求助]二级指针
数据加载中...
 
   



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

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