指针与引用 (二)

例题1:

class A {
public:
	A() {
		m_a = 1;
		m_b = 2;
	}

	void fun() {
		printf("%d%d
", m_a, m_b);
	}
private:
	int m_a;
	int m_b;
};

class B {
public:
	B() {
		m_c = 3;
	}

	void fun() {
		printf("%d
", m_c);
	}
private:
	int m_c;
};

int main() {
	A a;
	B *pb = (B*) (&a);
	pb->fun();
	return 0;
}

考察内存偏移, 答案 1.

编译器对 m_c 的认识就是 m_c 距离对象的偏移为 0, 于是打印了 m_a 的值

当 B 继承 A 时, 再次运行程序, 返回的是一个未定义的值, 原理还是内存偏移.

依然是访问未定义的值, 这次为什么没报错

例题2:

/*
 *	swap2 的问题在于没有为temp 申请空间	
 */
void swap2(int *p, int *q) {
	int *temp;
	*temp = *p;
	*p = *q;
	*q = *temp;
}

/*
 *	p, q 只是副本
 */
void swap3(int *p, int *q) {
	int *temp;
	temp = p;
	p = q;
	q = temp;
}
// OK
void swap4(int *p, int *q) {
	int temp;
	temp = *p;
	*p = *q;
	*q = temp;
}
原文地址:https://www.cnblogs.com/zhouzhuo/p/3639548.html