上课的时候提到了可以有 f(int *&p)
这种写法,我测试了一下,发现
#include <iostream>
using namespace std;
int f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return *p;}
int main() {
int *x = 0;
int *y = 0;
*y = f(x);
cout << "*y : " << *y << endl;
return 0;
}
和:
#include <iostream>
using namespace std;
int &f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return *p;}
int main() {
int *x = 0;
int *y = 0;
*y = f(x);
cout << "y|&y : " << y << '\t' << &y << endl;
return 0;
}
这两种方法有点问题,不能输出y,在 cout << "y|&y : " ……
这一句之前就断掉了。用 clang++ -Wall
没有任何warning。改成 *f(int *&p)
形式:
#include <iostream>
using namespace std;
int *f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return p;}
int main() {
int *x = 0;
int *y = 0;
y = f(x);
cout << "y|&y : " << y << '\t' << &y << endl;
return 0;
}
这样才有输出为:
p|&p : 0x4 0x61fe10
y|&y : 0x4 0x61fe08
所以前两种方法错在那?还有第三种方法的0x4代表什么?
全是 UB (undefined behavior, 未定义行为)。
int *x = 0;
这个实际是一个空指针。通过它无论读写其中的值都可能是运行时错误。