【发布时间】:2018-10-23 02:19:19
【问题描述】:
下面的测试代码,我将输出信息放在注释中。 我使用的是 gcc 4.8.5 和 Centos 7.2。
#include <iostream>
#include <cstdio>
class C
{
public:
void foo() {
printf("%p, %p\n", &C::c, &(C::c)); // output value is 0x4, 0x7ffc2e7f52e8
std::cout << &C::c << std::endl; // output value is 1
}
int a;
int c;
};
int main(void)
{
C co;
printf("%p\n", &C::c); // output value is 0x4
std::cout << &C::c << std::endl; // output value is 1
// printf("%p\n", &(C::c)); // compile error, invalid use of non-static data member 'C::c'
co.foo();
return 0;
}
- 根据C++ operator Precedence,
::运算符的优先级高于&运算符。我认为&C::c等于&(C::c),但输出却不然。为什么它们不同? -
&(C::c)在 main 中导致编译错误,而在foo函数中却没有,这是为什么呢? -
printf和std::cout中&C::c的值不同,这是为什么呢?
【问题讨论】:
-
您不能
printf指向成员值的指针。%p仅用于常规指针。 -
@n.m.更糟糕的是,
%p仅适用于void *。
标签: c++