C++使用指针为什么要为其分配空间

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