. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  指针的大小,指针是存放的偏移地址吗?  [待解决] 回复[ 10次 ]   点击[ 1329次 ]  
mouse
[帖 主]   [ 发表时间:2007-11-26 21:06 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
指针的类型是由什么决定的呢?    
  sizeof(Type   *)=??    
  ==================    
  指针的大小是由内存寻址空间决定的,即地址总线决定。    
   
  一般32位机寻址空间4G,所以指针占4字节;     
  一般8位的单片机寻址空间是64k,所以指针占2字节。 
---------------------------------- 
指针的大小是由内存寻址空间决定的->能不能说:指针存放的是地址,所以它于内存寻址的能力有关,在8086cpu下,地址线是20根,它的寻址能力是1兆。它采用的是段地址+偏移地址(各占两个字节),指针中存放的是偏移地址-》2个字节?? 

char * a   
int * a    
-----------------  
至于这两个,我觉得前面的数据类型,是在a++的时候起作用,访问下一个数据时候向后地址偏移一个字节还是一个字和取出的字节还是字。
lion
[第1楼]   [ 回复时间:2007-11-27 10:46 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2007-07-10 11:31
指针的类型是由编译器决定的
如:char *a a++
和:int  *b b++
同样是++,但是越过的字节数是不同的,a越过1个字节,b越过两个字节,这是由编译器决定的,编译器在编译时看到a是char型的,所以将a++编译成越过一个字节的指令,看到b是整型的,所以将b++编译成越过两个字节的指令。

指针的实质是指向一段内存空间的地址。

16位平台有两种指针,长指针和指针(寻址方式决定的)。
长指针长度16+16=32位,可段间使用;
指针长度16位用于段内使用。
fishboy
[第2楼]   [ 回复时间:2007-11-27 11:29 ]   [引用]   [回复]   [ top ] 
荣誉值:283
信誉值:0
注册日期:2007-06-26 11:42
指针也是一个数据类型。指针变量保存的是地址,这个在既定了指针的类别(near,far)之后,指针变量占的内存空间基本上就受指针类别的影响。但是,一个指针类型的数据占多大的内存空间,要看生命的指针的类型是什么类型了,比如说int *p,char *p,当你在p++的时候,他是按照类型占的空间大小为变化单元的,比如说int*p的p++就相当于:p变量的指向的地址 + 2(tc下int型占两个字节),而对于char*p的p++来说就相当于:p变量的指向的地址 + 1(tc下char型占一个字节)。

说的不好,不知道能不能帮楼主。呵呵
mouse
[第3楼]   [ 回复时间:2007-11-27 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
今天看了博客里面的文章和自己找得一些资料,在16位机下,指针占两个字节,16位,存放的是偏移地址,长指针占四个字节,32位,存放的是段地址和偏移地址,这个和jmp指令类似。 

这是我博客中一位朋友的回贴: 
指针的分类确实类似于jmp分类,应该说是一个规则,jmp是跳到那里,那取出存放的地址,然后给ip(段内转移)或是cs/ip(段间转移),  
而指针操作的步骤要多些,我觉得是这样:  
比如我们要得到指针的值*a  
保存现场(取完值得跳回来)->jmp 地址->取回地址的内容(在这里用到了char *前面的char,到底是取多少字节回来)->把现场的cs/ip在设置回来 
---------------------- 
不知道这个指针操作的步骤对不对???
mouse
[第4楼]   [ 回复时间:2007-12-16 10:31 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
没有人给答案阿,我觉得是对的。
mouse
[第5楼]   [ 回复时间:2007-12-16 10:31 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
没有人给答案阿,我觉得是对的。
evildriver
[第6楼]   [ 回复时间:2007-12-16 12:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-10-02 13:54
保存现场(取完值得跳回来)->jmp 地址->取回地址的内容(在这里用到了char *前面的char,到底是取多少字节回来)->把现场的cs/ip在设置回来
------------------------
应该没这么麻烦吧,只是读取数据而已又不是跳到那里执行
我觉得读取指针所指向的数据应该是ds和指针值一同决定的
mouse
[第7楼]   [ 回复时间:2007-12-18 12:27 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
确实有些麻烦了,是不是这样:
我们写程序的时候定义了指针,跟其它变量一样,在C语言编译器编译时候就分配了内存,存放偏移地址或是段地址和偏移地址,具体执行访问就和汇编的访问内存单元一样得到数据。

我觉得这样应该是比较合理的,保存现场有些过头了~
evildriver
[第8楼]   [ 回复时间:2007-12-18 12:36 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-10-02 13:54
我也这样觉得,应该是编译的时候分配内存并对ds赋值,而指针就是存放偏移地址的,读取的时候再根据ds和指针得到数据
mouse
[第9楼]   [ 回复时间:2007-12-20 10:17 ]   [引用]   [回复]   [ top ] 
荣誉值:472
信誉值:12
注册日期:2007-10-16 15:34
终于把C的指针弄得开始清楚了,自己顶下,嘿嘿
今天努力完成第十章程序,fighting~
zhuzhu
[第10楼]   [ 回复时间:2008-01-14 20:25 ]   [引用]   [回复]   [ top ] 
荣誉值:50
信誉值:0
注册日期:2007-07-08 09:33
指针-c语言的灵魂啊;_
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved