帮忙解释下运行结果

haihai05 2009-03-23 12:36:03
#include<stdio.h>

void main()
{
char *pChar;
int *pInt;
int nValue[10];
int i;
for(i =0; i<10;i++) nValue[i] = i;
pChar = (char *)nValue;
pInt = (int *)nValue;
pChar += 6;
pInt += 6;
printf("*pChar = %d\r\n", *pChar); //0
printf("*pInt = %d\r\n", *pInt); //6
}


...全文
130 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangf1983 2009-03-23
  • 打赏
  • 举报
回复
楼上的正解
bushizhuge 2009-03-23
  • 打赏
  • 举报
回复
数组在内存之中是一片连续的内存块,所以nValue[10]在内存之中是10*sizeof(int)个字节的连续空间。pChar = (char *)nValue;这一句将pChar指向了数组的首地址,pChar += 6;在内存中的位移是sizeof(char)*6也就是6位,所以此刻*pChar指向的地址是nValue[10]这个数组内存的第6位,这里列出前八位地址(假设这个机器中int为4个字节位长)存储的内容分别是 0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00(小端机器,即最低有效字节在最前面),0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x01(大端机器)。这样此刻pChar指向的地址里存储的内容为0x00,pChar一次读取一个字节,所以结果读出来是0x00。而pInt是int指针,所以pInt += 6;在内存中位移是 sizeof(int)*6,pInt一次读取sizeof(int)个字节,这和nValue[10]数组读取数据的方式一样,所以结果应该是和nValue[6]值一样,为 6
haihai05 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mengde007 的回复:]
pChar和pInt都没申请空间,然后都被赋一个值,就这样。如果你想输出多个的话,那就应该new
[/Quote]

这用申请内存空间?不是吧!!不明白!!
liusichen_0 2009-03-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 haihai05 的帖子:]
C/C++ code#include<stdio.h>

void main()
{
char *pChar;
int *pInt;
int nValue[10];
int i;
for(i =0; i<10;i++) nValue[i] = i;
pChar = (char *)nValue;
pInt = (int *)nValue;
pChar += 6; // 指向nValue开始的第六个字节 在现在的32位机器上一个整数是4个字节,
// pChar现在的位置应该在第二个整数的第三个字节,
// 而且因为这个整数为1,第三个字节全部为0,
pInt += 6; // 指向nValue开始的第六个整数

printf("*pChar = %d\r\n", *pChar); //0 输出时printf把pChar指向地址开始的一个字节数据取出来,再转换成整数输出,当然是0了
printf("*pInt = %d\r\n", *pInt); //6 这个应该没有什么问题吧
}
[/Quote]
threeleafzerg007 2009-03-23
  • 打赏
  • 举报
回复
上面写错
(char *)pointer += sizeof(pointer type) * offset
pointer type 也就是 char int 之类的
liumingrong 2009-03-23
  • 打赏
  • 举报
回复
T*指针加1实际上会将指针移动sizeof(T)个字节

*T解引用时编译器根据类型信息来解释内存,比如*pChar,编译器将pChar所指的那个字节作为”值“
而*pInt,编译器将pInt和其连续后续共4个字节的内存内容作为”值“

另外需要注意的是大小端的问题,比如int值1在内存中可能前三个字节全0,后一个字节为1(000000001),
也有可能第一个字节为1,后三个字节全0
ljmscsq 2009-03-23
  • 打赏
  • 举报
回复
nValue[10]
值0 1 2 3 4 5 6 7 8 9
内存值 00 00 00 00 01 00 00 00 02 00 00 00 .............
pChar = (char *)nValue; 用一个char指针指向这片内存首地址。
pChar += 6; pChar就指到01后第二个00位置。所以输出0
pInt = (int *)nValue;用一个int指针指向这片内存
pInt += 6;原来nValue就是int型的,pInt+=6相当于pInt[6]就是nValue[6] 所以输出6
threeleafzerg007 2009-03-23
  • 打赏
  • 举报
回复
其实代码核心也就是考察,在指针类型不同的时候,+6的区别了。 也就是 pointer+= 6 等价于 (char *)pointer += sizeof(pointer type)
  • 打赏
  • 举报
回复
void main()
{
char *pChar;
int *pInt;
int nValue[10];
int i;
for(i =0; i<10;i++) nValue[i] = i;
pChar = (char *)nValue;
pInt = (int *)nValue;
pChar += 6;            //char指针,pChar+6个字节偏移,0x00000000,0x0000(偏移到这里)0001,对应数据是00
pInt += 6; //int指针pInt+6个长字偏移,所以是6。
printf("*pChar = %d\r\n", *pChar); //0
printf("*pInt = %d\r\n", *pInt); //6
}
downmooner 2009-03-23
  • 打赏
  • 举报
回复
pChar += 6; 0x0001
haihai05 2009-03-23
  • 打赏
  • 举报
回复
自己顶下
mengde007 2009-03-23
  • 打赏
  • 举报
回复
pChar和pInt都没申请空间,然后都被赋一个值,就这样。如果你想输出多个的话,那就应该new
hb0800092 2009-03-23
  • 打赏
  • 举报
回复
我调试了一下
我估计是这个样的 你看看
你声明的nValue 是int 的型的 nValue中的每个元素都是4个字节
再内存中数据的高字节存高地址低字节存低地址
所以 你的nValue中的每个元素的高地址都是0

当pChar = (char*)nValue的时候是把nValue的首地址赋值个pChar
而你的pChar 是指向1个字节的 也就是说 pChar+=6是使pChar 指向了从nValue开始的第六个字节地址
而那个地址有刚好是0
你看你的nValue的元素在内存中的存储位置
1 4 8 ...
你用pChar += 4的话 可以输出1
tdjdyq 2009-03-23
  • 打赏
  • 举报
回复


void main()
{
char *pChar;
int *pInt;
int nValue[10];
int i;
for(i =0; i <10;i++) nValue[i] = i;
pChar = (char *)nValue;
pInt = (int *)nValue;
pChar += 6;            //char指针,pChar+6个字节偏移,0x00000000,0x0000(偏移到这里)0001,对应数据是00
pInt += 6; //int指针pInt+6个长字偏移,所以是6。
printf("*pChar = %d\r\n", *pChar); //0
printf("*pInt = %d\r\n", *pInt); //6
}

//////////////////////////////////////

这个有点错误吧!?
应该是

void main()
{
char *pChar;
int *pInt;
int nValue[10];
int i;
for(i =0; i <10;i++) nValue[i] = i;
pChar = (char *)nValue;
pInt = (int *)nValue;
pChar += 6;            //char指针,pChar+6个字节偏移,0x00000000,0x00000001,0x0000(应该是偏移这个吧)0002对应数据是00
pInt += 6; //int指针pInt+6个长字偏移,所以是6。
printf("*pChar = %d\r\n", *pChar); //0
printf("*pInt = %d\r\n", *pInt); //6
}


pChar += 6;  是在0x00000000这个基础在6个字节偏移吧

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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