c语言指针的问题

飞翔到天边 2012-03-29 10:43:44
今天有人问了我这个问题,我是从来没见过,求救啊

int a[5]={1,2,3,4,5};
int *ptr = (int *)((int)a +1);

上面怎么解释?(int)a是什么意思?
...全文
286 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔到天边 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
前几天看过这样的一个帖子,原帖好像是这个问题

C/C++ code


#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int *ptr2=(int *)((int)a+1);
int *ptr1=(int *)(&a+1);
printf("%x,%x\n",ptr1[-1],ptr2);
……
[/Quote]
嗯,是这样解释的,我已经想明白了,就是考察计算机的数据存储模式,就是之前没讲过这种将地址转换成数值再+1的,不过这个问题貌似没多大意义……
漫步者、 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不能解释结果为什么是那个,(int)a +1就是把地址强制转换成整型,那么加1就是一般的加1字节了,而不是地址的加4个字节了。
C/C++ code
int a[5]={1,2,3,4,5};
00C53618 mov dword ptr [ebp-1Ch],1
00C5361F mov dword ptr [ebp-18h],2
00C53626……
[/Quote]
++
qzf368 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不能解释结果为什么是那个,(int)a +1就是把地址强制转换成整型,那么加1就是一般的加1字节了,而不是地址的加4个字节了。
C/C++ code
int a[5]={1,2,3,4,5};
00C53618 mov dword ptr [ebp-1Ch],1
00C5361F mov dword ptr [ebp-18h],2
00C53626……
[/Quote]
这样地址不对齐的情况操作系统不报错?
qzf368 2012-03-30
  • 打赏
  • 举报
回复
奇怪, 其实对一个不是4的整数倍的地址取int value, OS要爆出bus error才对, arm应该是这样
Armor_hh 2012-03-30
  • 打赏
  • 举报
回复
强制转化
youngyang 2012-03-30
  • 打赏
  • 举报
回复
赞同三楼用汇编语言来解答这问题的方法:在这引用下
假定地址:00H,01H,02H,03H,04H,05H,06H,07H....
储存数: 01H,00H,00H,00H,02H,00H,00H,00H....低位方低值高位方高值
a[]= { 1, 2,.....
int *ptr = (int *)((int)a + 0);
输出为以地址00H开始的值:00000001H
int *ptr = (int *)((int)a + 1);
输出为以地址01H开始的值:02000000H 为什么加一个字节 三楼的已经将清楚了
int *ptr = (int *)((int)a + 2);
输出为以地址02H开始的值:00020000H
likejieicy 2012-03-30
  • 打赏
  • 举报
回复
楼主题说错了 。。。(int *)((int*)a +1);
这个题是考察点在于,指针移动发生的位移跟指针本身类型的关系 不知道你懂没懂
如果你非要说 没错。。。、就是 (int *)((int)a +1);
那我只能说 出题的人 脑袋进大便了 对于不同的编译器 不同的平台 不同的电脑 一个指针的地址 都不尽相同 谁能告诉我 结果是啥? 疯了。。。如果丫告诉你 "结果是 12FF71" 你可以很 清晰洪亮的呼喊他的名字 “傻逼。。。”

[Quote=引用楼主 的回复:]
今天有人问了我这个问题,我是从来没见过,求救啊

int a[5]={1,2,3,4,5};
int *ptr = (int *)((int)a +1);

上面怎么解释?(int)a是什么意思?
[/Quote]
Ever_lover 2012-03-30
  • 打赏
  • 举报
回复
错了一点,改正: printf("%x,%x\n",ptr1[-1],*ptr2);
Ever_lover 2012-03-30
  • 打赏
  • 举报
回复
前几天看过这样的一个帖子,原帖好像是这个问题

#include<stdio.h>
int main()
{
int a[]={1,2,3,4,5};
int *ptr2=(int *)((int)a+1);
int *ptr1=(int *)(&a+1);
printf("%x,%x\n",ptr1[-1],ptr2);
}

运行结果是5,2000000,此在小端模式下,c此题主要是考察小端存储,就是说高地址存放高位,第地址存放低为按照这个仔细分析一下就明白了,另外的明白ptr1[-1],这个什么意思,这个的意思就是说如果ptr1=&a[5];那么ptr1[-1]=a[4];ptr[-1]=*(ptr1-1);,按照小端分析在按照大端分析就明白了,结果是不一样的
zeko075 2012-03-30
  • 打赏
  • 举报
回复
赵老师在不在啊···求赵老师指点啊···
zeko075 2012-03-30
  • 打赏
  • 举报
回复
int a[5]={1,2,3,4,5};
int A, B;
int *ptr;

printf("%#X\n", a);
printf("%d\n\n", a);
A = (int)a;
B = A + 1;
ptr = (int *)B;
printf("%d\n", A);
printf("%d\n", B);
printf("%#X\n", ptr);
printf("%d\n", *ptr);
printf("%#X\n", *ptr);
最后的输出结果是:
0X12FF34
1244980

1244980
1244981
0X12FF35
33554432
0X2000000
按理来讲最后输出的应该是内存呢地址为0X12FF35中的内容,但是为什么在不同的电脑中输出的是一样的呢??
inspire_YI 2012-03-30
  • 打赏
  • 举报
回复
(int)a中(int)是强制转换符吧,a代表数组首地址,就是把数组的地址强制转换成整形数吧。
BadPattern 2012-03-30
  • 打赏
  • 举报
回复
可能本意题目是考大端小端数据存储的,在不同的机器上打印出来的结果不同,比如我的机器是高地址放低位,打印出来的是2000000,因为ptr对应的位变成了:0000 0020 0000 0000 0000 0000 0000 0000
在高地址放高位的机器上打印出来的结果应该是 100.
不过直觉上这样的做法肯定会有问题,取int型不字节对齐,将一个指针强转成一个int型....
sghdls 2012-03-30
  • 打赏
  • 举报
回复

打错了吧
猪头小哥 2012-03-29
  • 打赏
  • 举报
回复
只有调试的时候才能看到 vs是调试 -> 窗口 -> 反汇编。
[Quote=引用 13 楼 的回复:]

引用 3 楼 的回复:

不能解释结果为什么是那个,(int)a +1就是把地址强制转换成整型,那么加1就是一般的加1字节了,而不是地址的加4个字节了。
C/C++ code
int a[5]={1,2,3,4,5};
00C53618 mov dword ptr [ebp-1Ch],1
00C5361F mov dword ptr [ebp-1……
[/Quote]
querdaizhi 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

不能解释结果为什么是那个,(int)a +1就是把地址强制转换成整型,那么加1就是一般的加1字节了,而不是地址的加4个字节了。
C/C++ code
int a[5]={1,2,3,4,5};
00C53618 mov dword ptr [ebp-1Ch],1
00C5361F mov dword ptr [ebp-18h],2
00C53626……
[/Quote]

请问一下怎么查看汇编代码啊?
飞翔到天边 2012-03-29
  • 打赏
  • 举报
回复

[Quote=引用 10 楼 的回复:]
int a = 0; a + 1等于4?显然不对。


引用 9 楼 的回复:

我用%x输出的,结果是20000000,%d输出的和你的一样。(int)a将a强制转换成int型,那么+1,我觉得应该是+sizeo(int),即加4个字节,为什么是加一个字节啊?
[/Quote]

呵呵,刚才被弄得有点懵了,现在知道了,谢谢!
飞翔到天边 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
不能解释结果为什么是那个,(int)a +1就是把地址强制转换成整型,那么加1就是一般的加1字节了,而不是地址的加4个字节了。

C/C++ code
int a[5]={1,2,3,4,5};
00C53618 mov dword ptr [ebp-1Ch],1
00C5361F mov dword ptr [ebp-18h],2
00C5……
[/Quote]

为什么是+1个字节,而不是+(sizeof(int)),四个字节呢
猪头小哥 2012-03-29
  • 打赏
  • 举报
回复
int a = 0; a + 1等于4?显然不对。

[Quote=引用 9 楼 的回复:]

我用%x输出的,结果是20000000,%d输出的和你的一样。(int)a将a强制转换成int型,那么+1,我觉得应该是+sizeo(int),即加4个字节,为什么是加一个字节啊?
[/Quote]
飞翔到天边 2012-03-29
  • 打赏
  • 举报
回复
我用%x输出的,结果是20000000,%d输出的和你的一样。(int)a将a强制转换成int型,那么+1,我觉得应该是+sizeo(int),即加4个字节,为什么是加一个字节啊?
加载更多回复(8)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧