社区
C++ 语言
帖子详情
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)++是什么意思?
...全文
33
27
打赏
收藏
C++的语法问题
class A { ......; }; void main() { A i; int *p; p=(int *)(&i); ......; p++; (*p)++; ......; } 这里p=(int *)(&i)和p++以及(*p)++是什么意思?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
Visual
C++
6.0编程实例精解完整版(PDF)
通过一个具体的工具软件——Ftp文件搜索工具的完整开发过程,由浅入深、循序渐进、全面系统地介绍了 Microsoft Visual C++6.0基础知识和常用技巧。全书共分 10章,详细讲解了 Visual
C++
的基本
语法
知识及其主要的...
C语言大全第4版+源码(PDF)
本书是“C:The Complete Beference”的第四版。在第一版问世以来的几年中,程序设计领域已经发生了很大变化。Internet和World Wide Web已成为计算领域一道亮丽的风景,Java已经开发出来,
C++
也已标准化。与此同时,新的C标准(称为C99)也已制订。尽管C99并没有被大肆炒作,但它确实是过去5年里计算领域中最重要的一个事件。在历史的洪流中,人们很容易只注意那些新的事物,而忽视了用以构筑未来的坚实基础。C语言正是这样的基础。世界上的许多程序代码是在C上运行的。
C++
正是在此基础上建立的,其
语法
构成了Java的基础。然而,如果C仅是其他语言的起点,它就会成为有趣但却遭到遗弃的语 注: 原文件大小:15499 KB
数据挖掘第一次实验(数据预处理)的一些
C++
语法
问题
数据挖掘第一次实验(数据预处理)的一些
C++
语法
问题
数据挖掘第一次实验的
C++
问题
1) 文件IO2)Ifstream构造函数(ofstream基本同理):Ifstream构造函数参数解释:示例:3) fstream和ofstream中都有的成员函数:Fail()4) 对if(!outfile)的解释:就是上图的operater!函数的使用,与fail()方法基本同义5) string的assign()方法6) ifstream与ofstream的构造函数的文件路径要写绝对路径(整个完整路径) 数据挖掘第一次
vscode
c++
语法
检查以及指定
c++
标准
vscode
c++
语法
检查以及指定
c++
标准 下载插件 C/
C++
Clang Command Adapter 在extension中搜索并下载安装,使用时发现其
语法
检查不支持
c++
11 标准。需要在配置中指定。 在插件的配置中指定
c++
标准 在Cxxflags 中指定需要的
c++
标准即可。 配置完成后可以看到没有再显示
语法
错误了。 ...
c++
语法
详解 黄勇 网盘 下载
c++
语法
详解 黄勇 网盘 下载 微盘,百度网盘地址 https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章