非static成员去&操作

wanghb1989 2013-08-02 09:40:52
class A
{
public:

int b;
int c;
};
int main(int argc, char *argv[])
{

cout<<&A::c<<endl;
return 0;
}

cout<<&A::c<<endl;我的输出是1,如果改成A::b输出还是1
这个地方A::c的结果应该是5才对啊,求解释.
g++编译的
...全文
365 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 18 楼 lm_whales 的回复:
cout<< & (((classA *)(void*) (NULL)) ->c)<<endl; cout<< & (( (classA *)(NULL)) ->c)<<endl;
编译不通过
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 17 楼 lm_whales 的回复:
试试这个: cout<< & ((A *) (0)->c)<<endl;
这个编译都不通过
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 16 楼 lin5161678 的回复:
[quote=引用 10 楼 wanghb1989 的回复:] &t.b是类对象中一个变量的地址,这个&A::b不是地址,是偏移值 这样&t.b==&t+&A::b才对
偏移量这个说法是谁教的? 那么 你的偏移量怎么解释 在mingw5中&A::b 和&A::c 一样是1??[/quote] mingw5这个不知道是什么.. 在g++中,&A::b 和&A::c 用cout输出和printf输出不一样. 移量这个说法是谁教的? 李普曼(c++pirmer作者)的另一本书中有介绍,书名<深度探索c++对象模型
zhctj159 2013-08-02
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A{
public:
  int b;
  int c;
};

int main(){
	cout<<&A::c<<endl;
	//以下为正确的用法
	int A::* pOffset = &A::c;
	int nOffset = (int)(*(void**)(&pOffset));
	cout<<nOffset<<endl;
	
	return 0;
}
lm_whales 2013-08-02
  • 打赏
  • 举报
回复
cout<< & (((classA *)(void*) (NULL)) ->c)<<endl; cout<< & (( (classA *)(NULL)) ->c)<<endl;
lm_whales 2013-08-02
  • 打赏
  • 举报
回复
试试这个: cout<< & ((A *) (0)->c)<<endl;
lin5161678 2013-08-02
  • 打赏
  • 举报
回复
引用 10 楼 wanghb1989 的回复:
&t.b是类对象中一个变量的地址,这个&A::b不是地址,是偏移值 这样&t.b==&t+&A::b才对
偏移量这个说法是谁教的? 那么 你的偏移量怎么解释 在mingw5中&A::b 和&A::c 一样是1??
大尾巴猫 2013-08-02
  • 打赏
  • 举报
回复
我试过了,用cout都是输出1,和次序没关系。 用printf("%d\n",p)就得到0或者4(对应的p指向b或者c)。 也许是cout判断成员变量的指针,直接输出1。
#include <iostream>
using namespace std;

class A
{
public:
	int b;
	int c;
};

int main()
{
	A a;
	int A::*p;
	p = &A::b;
	printf("%d\n",p);     //输出0
	cout << p << endl;    //输出1
	a.*p = 10;
	cout << a.b << endl;  //输出b的值10
	a.c = 20;
	p = &A::c;           
	printf("%d\n",p);     //输出4
	cout << p << endl;    //输出1
	cout << a.*p << endl; //输出c的值20
	return 0;
}
max_min_ 2013-08-02
  • 打赏
  • 举报
回复
引用 13 楼 wanghb1989 的回复:
[quote=引用 12 楼 max_min_ 的回复:] [quote=引用 9 楼 wanghb1989 的回复:] [quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 wanghb1989 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

代码贴全一点看看
加个头文件:
#include<iostream>
using namespace std;
class A
{
public:
 
  int b;
  int c;
};
int main(int argc, char *argv[])
{
  
  cout<<&A::c<<endl;
  return 0;
}
[/quote] 选b ,c 那个变量都是一样的效果的。 你为什么认为是 5 呢?[/quote] &A::c是取偏移(offset),不是取地址的值,内存中b和c是偏移是不一样的[/quote] 只是申明,何来地址一说?[/quote] 那偏移值为何一样?[/quote] 一个空类 就只占一个字节的内存大小
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 12 楼 max_min_ 的回复:
[quote=引用 9 楼 wanghb1989 的回复:] [quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 wanghb1989 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

代码贴全一点看看
加个头文件:
#include<iostream>
using namespace std;
class A
{
public:
 
  int b;
  int c;
};
int main(int argc, char *argv[])
{
  
  cout<<&A::c<<endl;
  return 0;
}
[/quote] 选b ,c 那个变量都是一样的效果的。 你为什么认为是 5 呢?[/quote] &A::c是取偏移(offset),不是取地址的值,内存中b和c是偏移是不一样的[/quote] 只是申明,何来地址一说?[/quote] 那偏移值为何一样?
max_min_ 2013-08-02
  • 打赏
  • 举报
回复
引用 9 楼 wanghb1989 的回复:
[quote=引用 3 楼 max_min_ 的回复:] [quote=引用 2 楼 wanghb1989 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

代码贴全一点看看
加个头文件:
#include<iostream>
using namespace std;
class A
{
public:
 
  int b;
  int c;
};
int main(int argc, char *argv[])
{
  
  cout<<&A::c<<endl;
  return 0;
}
[/quote] 选b ,c 那个变量都是一样的效果的。 你为什么认为是 5 呢?[/quote] &A::c是取偏移(offset),不是取地址的值,内存中b和c是偏移是不一样的[/quote] 只是申明,何来地址一说?
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
[quote=引用 6 楼 hordemark 的回复:] 应该是5啊,这求的是变量C的便宜地址。
c根本就没创建 哪里来的地址 另外 一点都不用考虑内存对齐吗 一会1 一会5的 汗[/quote] 内存对齐,输出值只会大不会小
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 5 楼 lin5161678 的回复:
A t; &t.b就能看到你想看到了的 另外 别傻乎乎的以为 b和c连续存储 没这回事
&t.b是类对象中一个变量的地址,这个&A::b不是地址,是偏移值 这样&t.b==&t+&A::b才对
wanghb1989 2013-08-02
  • 打赏
  • 举报
回复
引用 3 楼 max_min_ 的回复:
[quote=引用 2 楼 wanghb1989 的回复:] [quote=引用 1 楼 max_min_ 的回复:]

代码贴全一点看看
加个头文件:
#include<iostream>
using namespace std;
class A
{
public:
 
  int b;
  int c;
};
int main(int argc, char *argv[])
{
  
  cout<<&A::c<<endl;
  return 0;
}
[/quote] 选b ,c 那个变量都是一样的效果的。 你为什么认为是 5 呢?[/quote] &A::c是取偏移(offset),不是取地址的值,内存中b和c是偏移是不一样的
hordemark 2013-08-02
  • 打赏
  • 举报
回复
引用 7 楼 lin5161678 的回复:
[quote=引用 6 楼 hordemark 的回复:] 应该是5啊,这求的是变量C的便宜地址。
c根本就没创建 哪里来的地址 另外 一点都不用考虑内存对齐吗 一会1 一会5的 汗[/quote] 这当然不是具体地址了,而是class内部的偏移地址
lin5161678 2013-08-02
  • 打赏
  • 举报
回复
引用 6 楼 hordemark 的回复:
应该是5啊,这求的是变量C的便宜地址。
c根本就没创建 哪里来的地址 另外 一点都不用考虑内存对齐吗 一会1 一会5的 汗
hordemark 2013-08-02
  • 打赏
  • 举报
回复
应该是5啊,这求的是变量C的便宜地址。
lin5161678 2013-08-02
  • 打赏
  • 举报
回复
A t; &t.b就能看到你想看到了的 另外 别傻乎乎的以为 b和c连续存储 没这回事
lin5161678 2013-08-02
  • 打赏
  • 举报
回复
你就不能创建一个对象在 & 吗?
max_min_ 2013-08-02
  • 打赏
  • 举报
回复
引用 2 楼 wanghb1989 的回复:
[quote=引用 1 楼 max_min_ 的回复:]

代码贴全一点看看
加个头文件:
#include<iostream>
using namespace std;
class A
{
public:
 
  int b;
  int c;
};
int main(int argc, char *argv[])
{
  
  cout<<&A::c<<endl;
  return 0;
}
[/quote] 选b ,c 那个变量都是一样的效果的。 你为什么认为是 5 呢?
加载更多回复(5)

64,651

社区成员

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

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