C++的语法问题

Tomorrow0 2003-10-18 01:19:30
class A
{
......;
};

void main()
{
A i;
int *p;
p=(int *)(&i);
......;
p++;
(*p)++;
......;
}
这里p=(int *)(&i)和p++以及(*p)++是什么意思?
...全文
32 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunjx119 2003-10-25
  • 打赏
  • 举报
回复
p=(int *)(&i);//(*int)是强制类型转换,此句将对象i的地址强制转换为整形指针(可能会出现问题)

p++;//将指针偏移一个sizeof(int)单位

(*p++);//将p所指对象本身自增一
WindFroce 2003-10-25
  • 打赏
  • 举报
回复
p = (int*)(&i);
i 是指向一个类的,类在内存中有它的存储单元,它包括两个整行的数据和一些函数拷贝.
现在p 指向aa的存贮地址(就是类的)当你p++时他指向了BB,所以*p 就是bb了,
如果你还p++ .我不知道会有什么后果,试试看吧!
Taikonaut5 2003-10-25
  • 打赏
  • 举报
回复
这种用法C中这么用比较普遍,但是在C++中,不多,因为有可能没有计算清楚,
访问到不该访问的区间,或者覆盖了其他的数据成员
比如 p+=12,后,你就可以更改别的数据了,不过我想你的程序也该出问题了
这就是为什么windows,对每个进程采用虚拟地址,说白了,就是你要完蛋,
就自己完蛋,如果以前,你写到别的程序数据区,别人也完了
为什么不这么做呢
Class A * p = & i;
多好. p->aa , p->bb
norikos 2003-10-25
  • 打赏
  • 举报
回复
类内部的成员如何排列是与编译系统和具体机器相关的,在内存中类的成员并非一定按声明次序摆放,还有内存的对齐问题等都由机器决定,对指针随便++谁知道应该移动多少啊,指针是需要知道类型长度才可以正确移动的,这就是为什么指针(一个4byte数据)也有类型.

如果不是smart pointer根本不能进入类的内部.
Taikonaut5 2003-10-25
  • 打赏
  • 举报
回复
对不起, 上面我说的
“开始p 指向i的时候指着i.aa位置,如果p++,后向后面移动2个字节p = &i.bb了“
应该是移动4个字节了,int 是4字节
Taikonaut5 2003-10-25
  • 打赏
  • 举报
回复
首先:指针的加减是以指针类型相关的
假设一个如上 int * p = (int * ) (&i);
因为现在p 是一个int型指针,那么p++, 就是向后面移动4个字节
char * t = (char *) p 的话, p++就向后面移动1个字节了.
开始p 指向i的时候指着i.aa位置,如果p++,后向后面移动2个字节p = &i.bb了
(*p)++就p指的数值+1, bb = 11了.
sizeof(class a),返回的是数据变量的大小
你可以看一下
另外这么写程序很危险,尽量不要这么做
norikos 2003-10-25
  • 打赏
  • 举报
回复
强烈抗议这种变态用法!
ceran 2003-10-25
  • 打赏
  • 举报
回复
学习!详细点...!
breekhuang 2003-10-25
  • 打赏
  • 举报
回复
学习~~~~
tudou614 2003-10-25
  • 打赏
  • 举报
回复
定义一个类的时候,这个类本身也有指针的属性,(class *)(我自己起的名)

事实上也确实如此


p=(int *)(&i)指的是将i的地址赋给p,并把p显示转换成int*
p++把地址向增加方向增1
(*P)++批的是p指向的单元元素i自增1
Tomorrow0 2003-10-25
  • 打赏
  • 举报
回复
另外,p开始的时候一定指向aa吗?一定指向第一个定义的数据成员?
Tomorrow0 2003-10-25
  • 打赏
  • 举报
回复
(int *)(&i)是将对象i的地址转为整形指针,i本身没有变化对不对?

假设类TA里的数据成员变为4个char型的aa,bb,cc,dd,
那么在int *p=(int *)(&i)和p++后,p是否指向dd了?

Tomorrow0 2003-10-24
  • 打赏
  • 举报
回复
to binkiss(阿斌):
p指向i的地址,为什么p++是移动两个字节?是强制转换成int的缘故吗?i已经转换成int了,那应该是成个i都是int,p++指向下一个int怎么还会是i内部的bb,应该是整个i后面的内存空间了啊?
另外p先指向aa,自增后再指向bb?那再自增又指向什么?

to kotton8848(jyq):
类的空间的大小不包括类中定义的成员函数吗?
kotton8848 2003-10-23
  • 打赏
  • 举报
回复
to Tomorrow0:
类是一种数据结构,在它初始化以后,内存就分配了存储空间,空间的大小就是类定义的成员的大小,所以应该是实例的数据成员。。。。(也可以说是第一定义的数据成员,两个是一样的)
binkiss 2003-10-23
  • 打赏
  • 举报
回复
p=(int *)(&i)和p++以及(*p)++
p=(int *)(&i)指的是将i的地址赋给p,使p指针指向i的址
p++指的是p指针移动两个字节//int 型的为两个字节char为一个字节
(*P)++批的是p指向的单元元素i自增1
qufan 2003-10-23
  • 打赏
  • 举报
回复
关注!
Tomorrow0 2003-10-23
  • 打赏
  • 举报
回复
指针指向一个类的实例时是指向这个实例的数据成员?而且是指向第一个定义的数据成员?
sunyuanzeng 2003-10-21
  • 打赏
  • 举报
回复
p一开始指向aa,p++(指向下一个单元)后指向bb,(*p)++是bb++,所以bb加1变成11
Tomorrow0 2003-10-18
  • 打赏
  • 举报
回复
#include <iostream.h>
class TA
{
private:
int aa;
int bb;
public:
void get();
void set_aa(int _aa);
void set_bb(int _bb);
};
void TA::get()
{
cout<<aa<<" "<<bb<<endl;
}
void TA::set_aa(int _aa)
{
aa=_aa;
}
void TA::set_bb(int _bb)
{
bb=_bb;
}

void main()
{
TA i;
int *p;
p=(int *)(&i);
i.set_aa(9);
i.set_bb(10);
i.get();
p++;
(*p)++;;
i.get();
cout<<sizeof(i)<<endl;
cout<<*p<<endl;
}

为什么bb会变成11,p又为什么会指向bb?
ppwf 2003-10-18
  • 打赏
  • 举报
回复
*p++,*(p++)是一样的
(*p)++和前两者不一样
加载更多回复(7)

64,637

社区成员

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

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