1.堆区空间的开辟和释放
下边是局部变量由编译器开辟空间,当函数调用结束,空间自动释放,因此,第二个cout无法输出。
int* fun()
{
int a = 10;//局部变量在程序运行的时候放在栈区,尽量不要返回地址,因为函数结束,编译器自动释放
int* p = &a;
return p;//调用函数结束,a=10这段空间释放
}
int main()
{
int* fun();//函数声明
int *p=fun();//函数调用,返回类型一个地址,地址赋给一个指针
cout << *p << endl;//但是编译器帮你保存了一次
cout << *p << endl;//这次就输不出来了
system("pause");
return 0;
}
运行的时候就会出问题
1.1堆区开辟空间程序实例
int* fun()
{
int* p = new int(10);//开辟了一个int类型的空间,里边的值是10,然后吧这个变量的地址赋给了int*类型的指针
return p;
}
int main()
{
int* fun();
int* p = fun();
cout << *p << endl;
cout << *p << endl;
delete p;//作用释放指针变量p所指向的动态空间,所以delete后边是指针类型,指向那段内存地址,无返回值
system("pause");
return 0;
}
2.引用
引用:
引用必须初始化;一旦初始化之后,就不能再把别名给别人了。
int ival=1024;
int &refVal=ival;//reVal就是ival的别名,前面必须是int类型
使用引用传参,代替指针,可以同时传回多个参数。
void reset(int &j) //int &j呼应实参的i,就可以认为是定义+初始化了
{
j++;
cout << j << endl;
}
int main()
{
int i = 0;
reset(i);
cout << i << endl;
system("pause");
return 0;
}
同时,为了在调用函数改变参数的值,可在形参那加一个const,这样的话,调用函数中j++就会报错,如下图所示,因为j不能改变。