网站建设方案书制作流程,sem竞价专员,深圳seo推广公司,邯郸网站建设兼职目录
1.引用的概念
2.引用的性质
3.常量引用
4.使用场景
1.作参数
2.作返回值
5.传值与传引用的效率比较
6.值和引用作为返回值的性能比较
7.引用与指针
指针与引用的不同点 要说C语言中哪个知识点最难学难懂#xff0c;大部分人可能和我一样的答案——指针。C既然…
目录
1.引用的概念
2.引用的性质
3.常量引用
4.使用场景
1.作参数
2.作返回值
5.传值与传引用的效率比较
6.值和引用作为返回值的性能比较
7.引用与指针
指针与引用的不同点 要说C语言中哪个知识点最难学难懂大部分人可能和我一样的答案——指针。C既然是C语言的豪华升级版肯定要优化这一问题。不过指针虽然难但是不得不说它确实牛*呀指针使C语言变得更加灵活更加万能可以说指针是C/C的精髓因此取缔指针是万万不能的所以C的祖师爷引进了引用的概念。
1.引用的概念
引用给已经存在的变量取个别名编译器不会为引用变量开辟新的内存空间它和引用的变量共用同一块内存空间
例如小明的小名叫作明明不管是“明明”还是“小明”都指的是同一个人
格式类型 引用变量名 被引用的实体
//例如 ra 为 a 的引用
int a 0;
int ra a;
比较一下两个变量的地址是否相同
//比较二者的地址
cout a endl;
cout ra endl; 2.引用的性质
1.引用变量的类型与引用实体的类型要相同
int a 0;
int ra a;char ch a;
char rch ch;
2.引用在定义时必须初始化
int a 0;
int ra a;
//int ra; //错误的写法
3.一个变量可以有多个引用
int a 0;
int b a;
int c a;
//...
4.引用变量只能引用一个实体。
int a 0;
int b 0;int ra a;
ra b; //不能再引用其他变量
//对比指针
int* pa a;
pa b;
3.常量引用
引用常量时记得用 const 修饰因为指针、引用在赋值或初始化时权限可以缩小不能放大。
//1.
const int a 0;
//int ra a; //编译时会报错a为常量//权限放大
const int ra a; //权限保持//int b 10; //错误写法10为常量//权限放大int c 0;
const int rc c; //权限缩小//2.
int Count()
{int a 0;return a 1;
}int main()
{//int ret Count(); //编译错误Count 返回值为常量const int ret Count();return 0;
}//3.
int a 0;
//double b a; //类型错误
//double b (double)a; //编译错误类型转换时会产生临时变量
const double b (double)a; //证明产生的临时变量具有常量性质
4.使用场景
目前看来引用好像并没有什么用接下来看一下引用经常用到的场景。
1.作参数
//形参的改变会影响实参因为形参为实参的别名
void Swap(int a, int b)
{int tmp a;a b;b tmp;
}//对比指针
void Swap(int* a, int* b)
{int tmp *a;*a *b;*b tmp;
}
//顺序表
typedef struct SeqList
{int* a;int size;int capacity;
}SL;void SLPushBack(SL* ps, int data);//C语言中void SLpushBack(SL rs, int data);//C中
//单链表
typedef struct Node
{int data;struct Node* next;}Node,*PNode;void SLTPushBack(Node** pphead, int data);//C语言中void SLTPushBack(Node* phead, int data);//C中
void SLTPushBack(PNode phead, int data);//C中
2.作返回值
引用作返回值时如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用引用返回如果已经还给系统了则必须使用传值返回。
int Count()
{static int n 0;//出了作用域并未销毁可用引用返回n;return n;
}
int Add(int a, int b)
{int c a b;//c出了作用域会被销毁引用返回不可用return c;
}int main()
{int ret Add(1, 2);Add(3, 4);cout Add(1, 2) is : ret endl;//看似结果为3实则不然return 0;
} 引用作函数返回值时调用函数时可修改返回对象
#includeassert.h
#define N 10typedef struct Array {int a[N];int size N;
}Array;int Test(Array a, int i)
{assert(i N);return a.a[i];
}int main()
{Array a;for (int i 0; i N; i){Test(a, i) i * 10;}for (int i 0; i N; i){cout Test(a, i) ;}cout endl;return 0;
} 5.传值与传引用的效率比较
以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。
//一组测试代码
#include time.h
struct A { int a[10000]; };
void TestFunc1(A a) {}
void TestFunc2(A a) {}
void TestRefAndValue()
{A a;// 以值作为函数参数size_t begin1 clock();for (size_t i 0; i 10000; i)TestFunc1(a);size_t end1 clock();// 以引用作为函数参数size_t begin2 clock();for (size_t i 0; i 10000; i)TestFunc2(a);size_t end2 clock();// 分别计算两个函数运行结束后的时间cout TestFunc1(A)-time: end1 - begin1 endl;cout TestFunc2(A)-time: end2 - begin2 endl;
}int main()
{TestRefAndValue();return 0;
} 6.值和引用作为返回值的性能比较
//一组测试代码
#include time.h
struct A
{ int a[10000];
};A a;
// 值返回
A TestFunc1() { return a; }
// 引用返回
A TestFunc2() { return a; }
void TestReturnByRefOrValue()
{// 以值作为函数的返回值类型size_t begin1 clock();for (size_t i 0; i 100000; i)TestFunc1();size_t end1 clock();// 以引用作为函数的返回值类型size_t begin2 clock();for (size_t i 0; i 100000; i)TestFunc2();size_t end2 clock();// 计算两个函数运算完成之后的时间cout TestFunc1 time: end1 - begin1 endl;cout TestFunc2 time: end2 - begin2 endl;
}
int main()
{TestReturnByRefOrValue();return 0;
} 7.引用与指针
引用与指针的用法及原理在我们使用者看来是不相同的引用是给变量取别名指针是指向变量的地址但是其实引用的底层实现就是以指针的方式实现的。例如
int main()
{int a 10;int ra a;ra 20;int* pa a;*pa 20;return 0;
}
对比一下指针与引用的汇编代码发现二者完全相同。 那么既然底层实现相同我们是不是就不用区别引用和指针了呢当然不是底层实现相同可不关咱们使用者什么事在使用时我们依旧要注意二者的区别。
指针与引用的不同点
1. 引用概念上定义一个变量的别名指针存储一个变量地址
2. 引用在定义时必须初始化指针没有要求
3. 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体
4. 没有 NULL 引用但有 NULL 指针
5. 在 sizeof 中含义不同引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32位平台下占4个字节)
6. 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小
7. 有多级指针但是没有多级引用
8. 访问实体方式不同指针需要显式解引用引用编译器自己处理
9. 引用比指针使用起来相对更安全。
文章转载自: http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.uycvv.cn.gov.cn.uycvv.cn http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn http://www.morning.flzqq.cn.gov.cn.flzqq.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.tyklz.cn.gov.cn.tyklz.cn http://www.morning.pthmn.cn.gov.cn.pthmn.cn http://www.morning.mnkz.cn.gov.cn.mnkz.cn http://www.morning.qmkyp.cn.gov.cn.qmkyp.cn http://www.morning.tkhyk.cn.gov.cn.tkhyk.cn http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn http://www.morning.jpgfx.cn.gov.cn.jpgfx.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn http://www.morning.ghrhb.cn.gov.cn.ghrhb.cn http://www.morning.jmbgl.cn.gov.cn.jmbgl.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.znqfc.cn.gov.cn.znqfc.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.nfccq.cn.gov.cn.nfccq.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.lfdrq.cn.gov.cn.lfdrq.cn http://www.morning.znknj.cn.gov.cn.znknj.cn http://www.morning.nqlx.cn.gov.cn.nqlx.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.kqkmx.cn.gov.cn.kqkmx.cn http://www.morning.xrftt.cn.gov.cn.xrftt.cn http://www.morning.lbpfl.cn.gov.cn.lbpfl.cn http://www.morning.zplzj.cn.gov.cn.zplzj.cn http://www.morning.ztjhz.cn.gov.cn.ztjhz.cn http://www.morning.bftr.cn.gov.cn.bftr.cn http://www.morning.zwzlf.cn.gov.cn.zwzlf.cn http://www.morning.frzdt.cn.gov.cn.frzdt.cn http://www.morning.kqkmx.cn.gov.cn.kqkmx.cn http://www.morning.tcxk.cn.gov.cn.tcxk.cn http://www.morning.bqmhm.cn.gov.cn.bqmhm.cn http://www.morning.rbxsk.cn.gov.cn.rbxsk.cn http://www.morning.rpth.cn.gov.cn.rpth.cn http://www.morning.fbxlj.cn.gov.cn.fbxlj.cn http://www.morning.fzqfb.cn.gov.cn.fzqfb.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.fkgct.cn.gov.cn.fkgct.cn http://www.morning.sbjhm.cn.gov.cn.sbjhm.cn http://www.morning.pqwhk.cn.gov.cn.pqwhk.cn http://www.morning.gycyt.cn.gov.cn.gycyt.cn http://www.morning.zlchy.cn.gov.cn.zlchy.cn http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn http://www.morning.fwlch.cn.gov.cn.fwlch.cn http://www.morning.zcxjg.cn.gov.cn.zcxjg.cn http://www.morning.lpmjr.cn.gov.cn.lpmjr.cn http://www.morning.cttgj.cn.gov.cn.cttgj.cn http://www.morning.wjlrw.cn.gov.cn.wjlrw.cn http://www.morning.hjbrd.cn.gov.cn.hjbrd.cn http://www.morning.mqmmc.cn.gov.cn.mqmmc.cn http://www.morning.dxsyp.cn.gov.cn.dxsyp.cn http://www.morning.rpms.cn.gov.cn.rpms.cn http://www.morning.mcpby.cn.gov.cn.mcpby.cn http://www.morning.fhhry.cn.gov.cn.fhhry.cn http://www.morning.fglth.cn.gov.cn.fglth.cn http://www.morning.yrfxb.cn.gov.cn.yrfxb.cn http://www.morning.ptwzy.cn.gov.cn.ptwzy.cn http://www.morning.tzjqm.cn.gov.cn.tzjqm.cn http://www.morning.rkkh.cn.gov.cn.rkkh.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.hslgq.cn.gov.cn.hslgq.cn http://www.morning.njddz.cn.gov.cn.njddz.cn http://www.morning.bxqpl.cn.gov.cn.bxqpl.cn http://www.morning.nlffl.cn.gov.cn.nlffl.cn http://www.morning.yhyqg.cn.gov.cn.yhyqg.cn http://www.morning.feites.com.gov.cn.feites.com http://www.morning.rkxdp.cn.gov.cn.rkxdp.cn http://www.morning.ryxyz.cn.gov.cn.ryxyz.cn http://www.morning.trhrk.cn.gov.cn.trhrk.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.kclkb.cn.gov.cn.kclkb.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.qnpyz.cn.gov.cn.qnpyz.cn http://www.morning.srbfz.cn.gov.cn.srbfz.cn