引用
今天在《剑指offer》用deque时,看到
std::deque<BinaryTreeNode*> dequeTreeNode;
BinaryTreeNode *pNode = dequeTreeNode.front();
front() 是返回双向队列的第一个元素的引用
可以把一个引用赋值给一个指针吗????我产生了困惑(实际上这是十分弱智的想法)
分析:
引用的本质就是一个 指针常量 Type *const p; 所谓的指针常量:即保保证指针指向的位置是不变的,而指向位置的内容是可以改变的。
int a = 1;
int * const p = &a;
p++; //error
*p = 10; //ok
所以,对引用的理解需要加深.
|
1、 引用是C++的概念,属于C++编译器对C的扩展 |
|
2、引用的本质 1)引用在C++中的内部实现是一个指针常量 Type& name çèType* const name 2)C++编译器在编译过程中使用指针常量作为引用的内部实现,因此引用所占用的空间大小与指针相同。 3)从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
|
|
引用在实现上,只不过是把: 间接赋值成立的三个条件的后两步和二为一。 //当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针) |
|
引用当左值 |
|
//基础类型a返回的时候,也会有一个副本
int b; //全局变量
int getAA1() { int a; a = 10; return a; }
int& getAA2() { int a; a = 10; return a; } int& getAA3() { b = 10; return b; }
void main21() { int a1 = 0; int a2 = 0;
a1 = getAA1(); a2 = getAA2();//可以。。而且 系统不生成返回值的副本
int &a3 = getAA2(); //乱码。若返回栈变量不能成为 其它引用 的初始值 Int &a4 = getAA2();// 可以 。。。全局变量
printf("a1:%d \n", a1); printf("a2:%d \n", a2); printf("a3:%d \n", a3);
system("pause"); } |
|
当函数返回值为引用时 (用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。这也就导致了返回栈变量时的问题)
若返回栈变量 不能成为 其它引用 的初始值 不能作为左值使用
若返回静态变量或全局变量 可以成为其他引用的初始值 即可作为右值使用,也可作为左值使用 C++链式编程中,经常用到引用,运算符重载专题
|
|
指针引用 |
|
//指针的引用而已 int getTe2(Teacher* &myp) { myp = (Teacher *)malloc(sizeof(Teacher)); myp->age = 34;
return 0; } |
|
1 const引用让变量拥有只读属性 |
|
void printTe2(const Teacher1 *const pt) {
}
//const引用让变量(所指内存空间)拥有只读属性 void printTe(const Teacher1 &t) { //t.age = 11; } |
|
2 Const引用 用字面量初始化const引用 |
|
void main() { const int b = 10; printf("b:%d", &b);
//int &a1 = 19; 如果不加const编译失败 const int &a = 19; printf("&a:%d \n", &a);
system("pause"); } |
|
|
demo.c
#include <stdio.h> #include <stdlib.h> int main() { int a = 0; int aa = 1; int &b = a; //声明a的引用并初始化 从此操作b就和操作a一样 printf("pa:%p,pb:%p\n", &a, &b);// 输出 :a和b的地址是一样的 说明a就是b int *p = &b; //指针p指向a的引用 (*p)++; printf("*p:%d,a:%d,b:%d\n", *p,a,b); //输出全是1 //int &a1 = 19;// Error;提示非常量引用的初始值必须为左值 const int &a1 = 19; // OK system("pause"); return 0; }

浙公网安备 33010602011771号