鱼C论坛

 找回密码
 立即注册
查看: 1785|回复: 10

指针和地址问题

[复制链接]
发表于 2016-4-7 11:27:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一个地址是不是等于一个字节??

我定义了一个整形的指针数组,然后让指针加一然后输出,可是为什么输出的不是连续到下一个地址,而是跳过四个地址直接输出第五个地址,
还有我知道整形是4个字节(32位编译器),这是不是说明一个地址等于一个字节。
可是我是让指针加一而不是让下标加一啊!!
a[1]的地址是1245040,让a[1]的地址加一应该是1245041,可是为什么会变成1245044

如下图:



求大神解答


地址

地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-7 13:25:38 | 显示全部楼层
地址不是4字节的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-7 14:07:03 | 显示全部楼层
指针加1,加的不是数字1,加的是1个单位指针数据类型的大小。
例如:sizeof(int) = 4 , int 类型的指针p+1,为地址值+4;
sizeof(char) = 1 ,char类型的指针p+1,为地址值加1.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-7 14:47:33 | 显示全部楼层
vincehxb 发表于 2016-4-7 13:25
地址不是4字节的吗?

一个地址等于4个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-7 14:51:22 | 显示全部楼层
LeoChou 发表于 2016-4-7 14:07
指针加1,加的不是数字1,加的是1个单位指针数据类型的大小。
例如:sizeof(int) = 4 , int 类型的指针 ...

如果:
sizeof(int) = 4 , int 类型的指针p+1,为地址值+4;
sizeof(char) = 1 ,char类型的指针p+1,为地址值加1;

那是不是说明一个地址等于一个字节了
例如:
sizeof(double) = 8 , double 类型的指针p+1,为地址值+8;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-7 15:46:04 | 显示全部楼层
本帖最后由 muyu0096 于 2016-4-7 15:49 编辑

你弄混了这2个概念:指针变量本身的大小,和指针指向的变量(即该类型)的大小。
前者主要是受到内存随机寻址的限制。具体的说,对于32位的系统,他能表示0到2的32次方个自然数(大概4G),因此寻址范围也就是 [0,4G],因此指针变量本身的大小就是2 的32次方--即4字节,因为它要能表示在这个范围内的任意一个数。
同样的道理,对于64位系统,指针变量本身的大小是8字节。

而指针指向对象的大小,取决于指向对象的类型,这个类型具体多大,一般取决于编译器,比如float,有的编译器是4字节,有的是8字节。
至于指针加减法,实际上是加上或者减去n个同类型的地址的大小。
sizeof也是如此,取的是该类型的大小。

所以,sizeof(float)在有的编译器上是4,有的是8.
但无论是哪种编译器,在32位机器上,sizeof(float*)一定是4,同样的sizeof(int*)=sizeof(double*)=sizeof(char*)=4-----注意:这里的类型是各种 float指针,int指针,。。指针本身也是一种变量类型.
但在64位系统里,他们都等于8

引申的复杂些,还可以对数组,甚至多维数组进行指针加减法,但无论如何,本质是看加减的层级是哪个类型。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-4-7 16:31:59 | 显示全部楼层
muyu0096 发表于 2016-4-7 15:46
你弄混了这2个概念:指针变量本身的大小,和指针指向的变量(即该类型)的大小。
前者主要是受到内存随机 ...

哦哦
那指针 +1 为什么不是地址增加一,而是地址加上指针指向的变量(即该类型)的大小

为什么

为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-7 18:02:55 | 显示全部楼层
夜雨de街灯 发表于 2016-4-7 16:31
哦哦
那指针 +1 为什么不是地址增加一,而是地址加上指针指向的变量(即该类型)的大小

因为没有意义啊,比如 int a[3]={1,2,3}; int* p=&a[1];
p+1可以表示a[2],如果是地址加1,那是啥意思?而且容易出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-7 21:39:36 | 显示全部楼层
muyu0096 发表于 2016-4-7 18:02
因为没有意义啊,比如 int a[3]={1,2,3}; int* p=&a[1];
p+1可以表示a[2],如果是地址加1,那是啥意思? ...

只是想知道原因而已
如果不是数组,
int a=1 , *p;
p=&a;
那么p+1代表什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-7 22:29:12 | 显示全部楼层
本帖最后由 muyu0096 于 2016-4-7 22:32 编辑

原因就是因为危险且没有意义啊
至于你的例子,p+1的指向,是根据你的具体程序来的。
比如,在有的编译器里(注意,是有的,不是所有),你这个例子里,p-1指向的就是p这个指针变量的地址,也就是p-1==&p.因为p是紧接着a定义的,是a的下一个变量,所以它挨着a,但因为都是放置在栈中的自动变量,而栈是向上生长的,所以,p-1是&p。
同样,p+1是寄存器EBP的值,是上一个栈的栈底,已经到了调用它的母函数---我姑且这么称呼吧---的栈空间了。已经造成数据的负溢出了,就是所谓的溢出攻击的原理---前提是溢出是攻击者有目的的控制的。
同样,如果你定义int b,a=1;那么p+1就指向了b。

所以,你看,p+1指向哪里是不确定的,所有不确定的东西在程序语言里都是危险的。也是没有意义的。
这也是有的语言不让使用指针的原因,指针好用,但危险。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-4-8 08:19:58 | 显示全部楼层
muyu0096 发表于 2016-4-7 22:29
原因就是因为危险且没有意义啊
至于你的例子,p+1的指向,是根据你的具体程序来的。
比如,在有的编译器 ...

非常感谢你的回答啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 22:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表