C++栈区和引用
-
栈的数据由编译器管理开辟和释放;
-
注意不要返回局部变量的地址
-
系统会保存一次,但只可以打印一次数据,
堆区
-
由程序员释放,在程序运行结束后会出现一个堆区。不释放系统自动回收
-
用new可开辟堆区,指针在栈区可用指针接受堆区的数据。因为指针在栈区指向和堆区一样的地址。可获取堆区的数据
-
int*fun()
{
int*p=new int (10);
return p;
}
void text01()
{
int*p=fun();
cout<<*p<<endl;
delete p;//由程序员释放了.
}
int main()
{
int*p=fun();
cout<<*p<<endl;
} -
在堆区开辟数组
-
void text02()
int *arr=new int [10];//数组有十个元素
for(int i=0;i<10;i++)
{
cout<<arr[i];
}
delete [] arr;
int main()
{
text02();
}引用
-
引用给变量起别名。
-
语法:数据类型&别名=原名;
-
int &b=a;
b=20;//修改别名,原名的值也会变
cout<<a<<endl;//输出的a的值为20 -
引用必须要初始化
-
int&b;//该操作时错误的
-
引用一旦初始化后,就不可以更改。也就是只能赋值给b,b不能引用别的数值了。
-
在main函数中引用本身需要一个合法的内存空间,因此
int &ret=10;const int&ret=10;//加入const后不可以修改变量
-
引用可以优化指针,不用像指针一样复制一份内存。引用直接给实参起别名。
-
//指针
void test01(int *a,int *b)
int main()
{
test01(&a,&b);
};
//引用
void test01(int &a,int &b)
int main()
{
test01(&a,&b);
}; -
//返回局部变量引用
int &test01()
{
int a=10;//局部变量
return a;
}
//返回静态变量引用
int &test02()
{
static int a=20;
return a;
}
int main()
{
int &ref1=test01();//不能返回局部变量的引用,第一次还会保存。
int &ref2=test02();
test02()=1000;//函数可以作为左值。
cout<<ref2<<endl;//输出的值为1000;
} -
只有函数静态变量的引用返回值可以作为左值。
![]()
-
引用的本质就是指针常量,上边的引用可以看成指针常量。系统自动转换int *const ref=&a;指向不可以变,值可以变。
-
引用在修改方法中的形参时,实参也会改变。故用常量引用const来防止实参被修改
-
void showvalue(const int&a) -
-
-

浙公网安备 33010602011771号