在对malloc函数进行测试的时候,共发现了几点特点,与大家分享:
先上代码
#include <iostream>
using namespace std;
int subfun(int& L) {
int* p;
p = &L;
return *p;
}
int main()
{
int a=10, b=11, c=12;
int* p1, * p2, * p3;
//p1 = 10; //会报错。第一点,指针不能直接赋值立即数类型的地址。
//p1 = a; //×
p1 = &a;
cout << p1<<" "<<&a<<endl;//p是指针,是a的地址赋值给了p
//---------------------------
p2 = (int*)malloc(sizeof(int));//p2是指针,但是没有确定的变量相关联
*p2 = 1000;//*p2是变量,不是指针
//p2 = &1000;//会报错×
cout << p2<<" "<<*p2<<endl;
//---------------------------
p3 = (int*)malloc(sizeof(int));//第二点:不初始化指针则无法赋值一个数值的地址(但代表数值的变量的地址可以)
*p3 = subfun(*p2);//将p2指针参数输入subfun,应该得到,p2指针代表的数值
cout << *p3 << endl;
//第三点:对于子函数,其参数主要看参数值中变量的格式
//比如子程序的参数是&L,那么看L,其格式为变量,那么
//在主函数调用子函数时,输入的应该为变量。
//指针也因该转为变量去输入,比如转为*p。
}
结果:
总结:
一:指针p=&x可以,但指针代表的内容*p=x则不可以,此时需要申请空间,因为指针在一开始并不指向一个具体的变量的空间存储位置,而“p“的意思是:指针p所代表的变量的空间位置。换句话说,你不给他空间位置,它何来意义?
未初始化的指针无法指向一个“数值”(但代表数值的变量可以)。
如果我们要对指针赋值一个变量的话,那么我们需要使用malloc申请这个指针所代表的变量占用的空间。
总之,在声明一个指针后,我们只要通过这个指针来操作指针指向的变量(如p=x),我们就必须使用malloc申请空间。
更具体简单的例子请见我的另一篇文章:
https://blog.csdn.net/qq_43210248/article/details/109046553
二:输入子函数的参数格式,只取决于是子函数的参数值中的“变量”的格式。
比如子程序的参数整体虽然是&L,但是格式只取决于L(是指针,还是变量)。
若其格式为变量,那么在主函数调用子函数时,输入的应该为变量。
这时,即使是指针也因该转为变量去输入,比如转为*p去输入。