首页
社区
课程
招聘
C语言指针问题
发表于: 2005-3-19 22:10 6730

C语言指针问题

2005-3-19 22:10
6730
在C中一个指针变量的长度总是2个字节  应该是记录了一个偏移地址吧   那么指针在做加一 类似运算的时候 怎么知道跨越几个地址呢?

谢谢!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 281
活跃值: (3030)
能力值: ( LV12,RANK:610 )
在线值:
发帖
回帖
粉丝
2
编译器知道的。

自己编一个小程序,然后静态反汇编和动态跟踪看看就知道了。
2005-3-20 03:03
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
3
用Sizeof取指针长度返回的总是4个字节,不是2个字节。
你在声明指针的时候通常是这样:char *p; 那么p++就会加1个字节,因为char就是1个字节;如果这样动态申请内存:DWORD *p = (DWORD *)malloc(sizeof(DWORD)); 那么p++就会加4个字节,明白了吧?
2005-3-20 09:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在32位程序里 sizeof();返回的都是4个字节
用TC编译的16位程序 返回的是2个字节吧
无论如何返回的都是一个内存单元   
指针变量中存的值也都是一个内存单元
int *a;
char *b;

a++;  b++;

a增加了两个内存单元
b增加了一个内存单元吧   
是怎么做到的??
2005-3-20 10:56
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
5
在WIN32下,int型变量占4个字节,所以a++增加4,char型变量占1个字节,所以b++增加1。至于你的a加了2,应该也是因为16位的缘故。
2005-3-20 13:22
0
雪    币: 236
活跃值: (155)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
最初由 answerooo 发布
在32位程序里 sizeof();返回的都是4个字节
用TC编译的16位程序 返回的是2个字节吧
无论如何返回的都是一个内存单元
指针变量中存的值也都是一个内存单元
int *a;
........

这个是在程序的编译过程中就确定下来的,因为指针是有类型的,每个指针指向的对象长度编译器是知道的因此在编译的时候就定下来++应该是多少,我在刚开始学的时候也遇到过这样的困扰,建议您可以看一下程序运行时候的汇编代码,相信您就会明白了。
2005-3-20 13:49
0
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
7
最初由 answerooo 发布
在32位程序里 sizeof();返回的都是4个字节
用TC编译的16位程序 返回的是2个字节吧
无论如何返回的都是一个内存单元
指针变量中存的值也都是一个内存单元
int *a;
........


C 的编译器有责任把指针正确地算计加减,不论是 a++ , a+1 , a[1] 等等

对于 C 编写者,你是可以不需要理会指针的大小

至于 int 的宽度,根据 ISO 标准是定义为系统的 bus 宽度,如果在一般 32 bit windows 里,它是 32 bit  ( 4 bytes )
2005-3-20 19:53
0
雪    币: 5
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼上说的 很对哦
2005-6-19 17:28
0
雪    币: 212
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
想不到今天没事还回顾了一上C的指针,乐
2005-8-1 17:54
0
游客
登录 | 注册 方可回帖
返回
//