2017C++基础——网课笔记(10到14)
十. 引用的本质
1. 引用所占用的大小,跟指针是相等的。
2. 常量需要初始化,引用也要初始化,引用可能本质上是一常量
const int a =10;
int& a=b;
十一.常量指针
对于 int array[10]。。array是位于“常量区”的。
而int & r=a; 而言,r也是位于常量区,它的*r指向a
十二.引用作为函数的返回值
#include <iostream>
using namespace std;
//引用作为返回值,不要返回局部变量的引用。
int& getFunc()
{
int a = 10;
return a;
} //int &temp = a;
//引用作为返回值,返回静态变量是ok的,因为在整个程序范围内都是有效的。
//或者malloc的这种动态内存分配也是可以的。
int& getFunc1()
{
static int a = 10;
return a;
}
int main()
{
int main_a = 0;
main_a = getFunc(); //main_a = temp; 而这里temp是a的别名
//也因此,上一行是一个数值拷贝的动作
cout<<"main_a = "<<main_a<<endl;
cout<<"-------------"<<endl;
int &main_a_re = getFunc();
cout<<"main_a_re = "<<main_a_re<<endl;
cout<<"main_a_re = "<<main_a_re<<endl;
cout<<"----------------"<<endl;
//引用如果当函数返回值的话,函数可以当左值,
//这是因为这个时候相当于对变量的别名了
getFunc1() = 1000;
cout<< "a= "<<getFunc1()<<endl;
return 0;
}
/*
运行结果:
main_a = 10
-------------
main_a_re = 10 //这里是10的原因是还没有压栈,这也是我们为什么需要输出两次这个值的原因
main_a_re = 4199040
*/
这里需要注意一点,当我们把引用作为一个返回值时,这个返回值绝对不能是局部变量,否则返回值将会是未知,且错误的
十三.指针引用
// day5.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
using namespace std;
struct Teacher
{
char name[64];
int age;
};
//在被调用函数获取资源
int getTeacher(Teacher **p)
{
Teacher *tmp = NULL;
if (p == NULL)
{
return -1;
}
tmp = (Teacher *)malloc(sizeof(Teacher));
if (tmp == NULL)
{
return -2;
}
tmp->age = 33;
//p是实参的地址,*实参的地址,去直接修改实参的值
*p = tmp;
}
int getTeacher2(Teacher * &myp)
{
//给myp赋值相当于给pT1赋值
myp = (Teacher *)malloc(sizeof(Teacher));
if(myp == NULL)
{
return -1;
}
myp->age = 36;
}
void FreeTeacher(Teacher *pT1)
{
if (pT1 == NULL)
{
return;
}
free(pT1);
}
int main()
{
Teacher *pT1 = NULL;
//1c语言的二级指针
getTeacher(&pT1);
cout << pT1->age;
FreeTeacher(pT1);
//2C++引用(指针的引用)
//引用的本质
getTeacher2(pT1);
cout << pT1->age;
FreeTeacher(pT1);
system("pause");
}