ptr[3]与ptr+3

insulted 2009-05-20 06:14:31

CLayoutSubClass1 *lsc = new CLayoutSubClass1;
int *ptr = (int*)lsc;
//std::cout << "vbc in CLayoutSubClass1 is " << *(int*)(ptr[3]) << std::endl;
std::cout << "vbc in CLayoutSubClass1 is " << *(int*)(ptr+3) << std::endl;

上面代码中的ptr[3]与ptr+3等同吗?
...全文
218 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
bitsjx 2009-05-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lire1213 的回复:]
显然不等
ptr[3]是值
ptr+3是地址
ptr[3] == *(ptr + 3)
[/Quote]
顶!
sentball 2009-05-22
  • 打赏
  • 举报
回复
不同!
然后
ptr+3 == 该地值偏移3个int,因为ptr是int,即12个字节,
lwwl0802 2009-05-22
  • 打赏
  • 举报
回复
楼上讲的很好,赞一个!~
insulted 2009-05-21
  • 打赏
  • 举报
回复
谢谢liliangbao兄!
insulted 2009-05-21
  • 打赏
  • 举报
回复
13楼能细讲一下吗?
mu_yang 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 insulted 的回复:

*(int*)(ptr[3])和*(int*)(*(ptr+3))才是等价的!

[/Quote]

语法上是等价的
但并没有真正的语言含义
xiangweixing 2009-05-21
  • 打赏
  • 举报
回复
楼上的牛人们,解答的非常对!
liberright 2009-05-21
  • 打赏
  • 举报
回复
一个是指针,一个是简单类型的返回引用。会相同吗???
Sou2012 2009-05-21
  • 打赏
  • 举报
回复
UP...
wanlong1215 2009-05-21
  • 打赏
  • 举报
回复
路过
liliangbao 2009-05-21
  • 打赏
  • 举报
回复
*(int*)(ptr[3]) //非法访问~

我是这样想的:
ptr[3]绝大多数情况是某个数据成员的值,而这个值是什么不确定,如:为0
而接着将这个值作为地址并取得他的值,即:取地址为0中的值,而这里地址是0的内存,系统是保护的你怎么可以读取呢~
这样就发生的非法访问~
insulted 2009-05-21
  • 打赏
  • 举报
回复
谢谢楼上各位达人!
总结一下吧:

3楼说得对:“那个(int *)是多余的,因为ptr本身就是int *类型的”

5楼的大哥,你说的“*(int*)(ptr[3]) //非法访问~”,不敢苟同,因为我此处这样的用法是想取出虚继承派生类中的虚表中的内容看看,应该不算非法吧?

以上高人的指点,我突然明白了:*(int*)(ptr[3])和*(int*)(*(ptr+3))才是等价的!

谢谢!
mu_yang 2009-05-21
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 insulted 的回复:]
13楼能细讲一下吗?
[/Quote]

按照你的定义
int *ptr ;

ptr[3]或*(ptr+3) 是int类型的
问题在于你的这个int类型的ptr[3]或*(ptr+3)中是一个地址的值么?
如果不是地址
那么
(int*)(ptr[3])有意义么

如果ptr[3]或*(ptr+3)中的确是一个地址的值
那么这个int *ptr ;的定义
实在很不高明
lire1213 2009-05-20
  • 打赏
  • 举报
回复
显然不等
ptr[3]是值
ptr+3是地址
ptr[3] == *(ptr + 3)
liliangbao 2009-05-20
  • 打赏
  • 举报
回复
ptr[3] 等同 *(ptr+3)
所以*(int*)(ptr[3]) 和*(int*)(ptr+3) 太不同了~
*(int*)(ptr[3]) //非法访问~
aaaa3105563 2009-05-20
  • 打赏
  • 举报
回复
顶上···
mu_yang 2009-05-20
  • 打赏
  • 举报
回复
ptr[3]与ptr+3显然不等同
ptr[3]与*(ptr+3)等同

*(int*)(ptr+3)是很奇怪的表达
那个(int *)是多余的
因为ptr本身就是int *类型的
lzh9955 2009-05-20
  • 打赏
  • 举报
回复
== ?
insulted 2009-05-20
  • 打赏
  • 举报
回复
对应的汇编分别是

0040151B push offset std::endl (402FA0h)
00401520 mov eax,dword ptr [ptr]
00401523 mov ecx,dword ptr [eax+0Ch]
00401526 mov edx,dword ptr [ecx]
00401528 push edx
00401529 push offset string "vbc in CLayoutSubClass1 is " (429358h)
0040152E push offset std::cout (4302A8h)
00401533 call std::operator<<<std::char_traits<char> > (403440h)
00401538 add esp,8
0040153B mov ecx,eax
0040153D call std::basic_ostream<char,std::char_traits<char> >::operator<< (401D40h)
00401542 mov ecx,eax
00401544 call std::basic_ostream<char,std::char_traits<char> >::operator<< (401CF0h)

====================================================================
0040151B push offset std::endl (402FA0h)
00401520 mov eax,dword ptr [ptr]
00401523 mov ecx,dword ptr [eax+0Ch]
00401526 push ecx
00401527 push offset string "vbc in CLayoutSubClass1 is " (429358h)
0040152C push offset std::cout (4302A8h)
00401531 call std::operator<<<std::char_traits<char> > (403440h)
00401536 add esp,8
00401539 mov ecx,eax
0040153B call std::basic_ostream<char,std::char_traits<char> >::operator<< (401D40h)
00401540 mov ecx,eax
00401542 call std::basic_ostream<char,std::char_traits<char> >::operator<< (401CF0h)

65,210

社区成员

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

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