typedef struct
{
double real; // 复数的实部
double imag; // 复数的虚部
}Complex;
void InitComplex(Complex* z) {
z = new Complex; // 给z分配了一块内存空间
}
void AssignComplex(Complex *&z, double a, double b) {
z->real = a;
z->imag = b;
}
int main()
{
while (1) {
double a1, b1;
Complex* z1 = NULL;
//z1 = new Complex; // 给z1分配了一块内存空间
// InitComplex(z1); // 无法用函数进行初始化
cout << "请输入第一个复数的实部:";
cin >> a1;
cout << "请输入第一个复数的虚部:";
cin >> b1;
AssignComplex(z1, a1, b1);
cout << "第一个复数为:";
Display(z1);
}
}
用的是Visual Stdio 2019
用结构体创建指针,
1.为什么初始化指针为NULL,报错:
0x004C2572 处(位于 AssignComplex.exe 中)引发的异常:
0xC0000005: 写入位置 0x00000000 时发生访问冲突。
2.为什么我调用函数为其分配空间,报错:
错误C4700:使用了未初始化的局部变量"z1"
3.只有直接为其分配空间才能运行:
z1 = new Complex;
4.为什么这个指针一定要为其分配空间才可以,初始化为NULL不可以吗
1. NULL在C/C++语言里就是表示没有分配空间,其实就是0。没分配空间,指针没有指向有效的内存空间,当然就没法用。
2. 可以调用函数分配空间,但是你传的参数或者返回值类型需要修改。
2.1 可以修改参数类型位Complex**,因为你需要提供一各地址来接受一各指针,所以是指针的指针。代码如下。是不是更晕了?
void InitComplex(Complex** z) {
*z = new Complex; // 给z分配了一块内存空间
}
int main()
{
while (1) {
double a1, b1;
Complex* z1 = NULL;
InitComplex(&z1);
2.2 你也可以修改函数的返回值类型void为Complex*,这样简单些。
Complex* InitComplex(void) {
return new Complex; // 给z分配了一块内存空间
}
int main()
{
while (1) {
double a1, b1;
Complex* z1 = InitComplex();
2.3 当然最简单的就是不需要定义分空间的函数,直接分配空间。当然如果分配空间之前要进行复杂的处理,或者根据不同配置实例化不同子类,定义函数分配空间是非常号的做法(你可以搜索设计模式里的工厂设计模式,拓展纸是面)
int main()
{
while (1) {
double a1, b1;
Complex* z1 = new Complex();
3. 上面2.1/2.2/2.3已经回答了。
4. 上面1已经回答了。
初始化的目的是为了安全性,虽然不初始化也可以。
重要的是分配空间,不然你无法存储数据。
void InitComplex(Complex *&z) { z = new Complex; // 给z分配了一块内存空间 }改成引用,这个函数就可以用。道理我也不是很懂,只知道引用肯定是可以的
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html