指针如何引用不同的类型?

时间:2011-12-15 01:20:15

标签: c++

  

(4.1 / 1)如果左值引用的对象不是对象   类型T并且不是从T 派生的类型的对象,或者是对象   是未初始化的,需要进行此转换的程序   未定义的行为。

由此,我假设

struct B {
     int x; };

B *p;
*p; //undefined behavior

*p是一个引用未初始化对象的左值。它如何引用不是'B'类型或其派生类型的对象?我误解了什么吗?

3 个答案:

答案 0 :(得分:3)

易:

int n = 5;
double * p = reinterpret_cast<double*>(&n);

*p += 1.0; // undefined behaviour: p points to an int, not a double

++*reinterpret_cast<int*>(p);  // legal; pointer can be cast back-and-forth

不太容易:

union bogus { int * a; double * b; } B;
int n;
B.a = &n;
*B.b += 1.0; // undefined behaviour

常见的C陷阱(产生无诊断!):

void do_a(void * p) { ++*reinterpret_cast<int*>(p); }
void do_b(void * p) { *reinterpret_cast<double*>(p) += 1.0; }

int main() { int n = 4; do_b(&n); /* eek */ }

答案 1 :(得分:2)

易。

 int i;
 B *p;
 p = (B*)&i;

完成。

答案 2 :(得分:2)

使它指向不属于对象T或派生类型的东西的一种方法是使用指针强制转换来打字:

struct A{ int x; };
struct B{ float x; };


A x;
B *p = (B*)&x;

*p;  //  Undefined behavior

在此示例中,指针p未指向B类型的某些内容。它指向A类型的某些内容,它是不兼容的。

请注意,此示例还违反了严格别名 - 这也是未定义的行为。