目录
一、new and delete
new用来开辟空间(在堆区),new后加开辟空间的类型
delete用来释放空间
#include<iostream> //引用文件
using namespace std;
int* Abc() //int* 类型的函数,说明返回类型是int*
{
int* a = new int(5);//开辟空间
return a;
}
void Test1()
{
int* p = Abc(); //用int* 来接收
cout << *p << endl; //打印
cout << *p << endl;
delete p; //delete 释放空间
cout << *p << endl;//在delete释放空间后再去访问p的地址,就是非法访问
}
int main()
{
Test1(); //调用函数
system("pause");
return 0;
}
二、delete
delete在释放数组空间的时候,必须在delete后加[ ]
#include<iostream> //引用文件
using namespace std;
void Test2()
{
int* pa = new int[10];
for (int i = 0; i < 10; i++)
{
pa[i] = i + 100;
}
for (int i = 0; i < 10; i++)
{
cout << pa[i] << endl;
}
delete[]pa;//必须加[],不然delete无法释放整个数组
}
int main()
{
Test2(); //调用函数
system("pause");
return 0;
}
三、引用
作用:给变量起别名
语法:数据类型 &别名 = 原名; //原名和别名类型要一致,别名指向的是原名的地址,无论哪一个改动都会改动到另一个
注意:1、必须初始化(不能注意写:数据类型 &别名;//这是错误的)
2、初始化后不可以改变(不能改变的意思是:不能当其他变量的别名,可以进行赋值操作)
值传递
地址传递
引用传递
基本语法
#include<iostream>
using namespace std;
int main()
{
int i = 5;
int &n = i;
cout << "i = " << i << endl;
cout << "n = " << n << endl;
n = 10;
cout << "i = " << i << endl;
cout << "n = " << n << endl;
system("pause");
return 0;
}
注意:
值传递(形参无法修饰实参)
为什么值传递中形参不能修饰实参?
因为值传递中形参就相当于一个局部变量,离开函数就会自动销毁,所以无法改变实参
地址传递
为什么地址传递形参可以修饰实参?
因为形参和实参地址指向的是同一块空间,所以形参修改空间内的数值,实参也会随着改变
引用传递
为什么引用传递形参可以修饰实参?
因为引用传递中,形参中的a相当于实参中的a的别名,所以改变形参中a的值也就是改变实参中a的值
四、 引用作为返回类型
为什么会出现这种情况?
因为a创建在函数Test1()里,属于局部变量,存储在栈区中,出了函数后空间就会被释放掉 ,所以要在int a起那么加static,将其变为全局变量,存储在静态区,这样出了函数空间后空间也还在
![]()
#include<iostream>
using namespace std;
#include<string>
int& Test2()
{
static int a = 10;
return a;
}
int main()
{
int& b = Test2();
cout << "b = " << b << endl;
cout << "b = " << b << endl;
Test2() = 100;
cout << "b = " << b << endl;
system("pause");
return 0;
}
五、引用的本质
引用的本质是一个指针常量
编译器检测到引用后会进行自动转化,将int& b = a;会转化为int* const b = &a;
将b转化为*b
同时因为有const所以引用只能指向一个地方
六、常量引用
加const后为什么可以了?
加const后编译器会将代码转化为
int temp(编译器自动设置的变量) = 5;int * const a = &temp;
修饰形参
因为没有加const,所以形参的值可以改变
加了const之后,形参就不能改变,防止出现误操作