资阳建设网站,专门做高端网站设计的云华设计,搜索引擎优化与关键词的关系,seo网站页面诊断目录
6. 引用
6.1 引用概念
6.2 引用特性
6.3 常引用
正确用法#xff1a;权限 缩小/平移
6.4 使用场景
1. 做参数
2. 做返回值
3.传值、传引用效率比较
6.5引用问题举例
6.6 反汇编中的
6.7 引用和指针的不同点#xff1a;
7.内联函数
7.1 内联函数与宏对…目录
6. 引用
6.1 引用概念
6.2 引用特性
6.3 常引用
正确用法权限 缩小/平移
6.4 使用场景
1. 做参数
2. 做返回值
3.传值、传引用效率比较
6.5引用问题举例
6.6 反汇编中的
6.7 引用和指针的不同点
7.内联函数
7.1 内联函数与宏对比
7.2 内联函数
7.2内联函数的特性
8. auto关键字
auto的使用细则
1. auto与指针和引用结合起来使用
2. 在同一行定义多个变量
3.auto不能推导的场景
9.指针空值nullptr 本篇为继承上一篇基础之上进行讲解# C入门 第一篇(C关键字 命名空间C输入输出)
6. 引用
6.1 引用概念
引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间。 就像是给他人取外号虽然称呼不同但是所代表的都是同一个人
类型 引用变量名(对象名) 引用实体;
void TestRef()
{int a 10; int ra a;//定义引用类型printf(%p\n, a);printf(%p\n, ra);
}6.2 引用特性
1. 引用在定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体再不能引用其他实不能像指针那样改变指向 因为为同一个地址故当其中一个发生改变时另一个会跟着一起改变 6.3 常引用
void TestConstRef()
{const int a 10; //int ra a; // 该语句编译时会出错a为常量 const int ra a; // int b 10; // 该语句编译时会出错b为常量 const int b 10; double d 12.34; //int rd d; // 该语句编译时会出错类型不同 const int rd d;
}具体讲解 为什么次数dc时报错了呢 当然此处与指针的特点相似 指针和引用进行 赋值/初始化 权限可以缩小但不能放大 const int c2; c时只能读的 而 int dc; 此时d 不仅变成了可以读而且还可以写扩大了权限故发生了报错 同样的例子权限放大 正确用法权限 缩小/平移 const int retCount();拓展 当定义 int i1; 时i 是一个整型变量。 接下来double rd i; 语句将一个 double 类型的引用 rd 绑定到了 i 上。引用 rd 和变量 i 现在指向同一个内存地址它们是同一个变量的不同名称。由于 rd 是 i 的引用可以通过 rd 修改 i 的值并且对 rd 的修改也会对 i 产生影响。 也可以理解为i作为变量而rd为与i同一地址为i的另名而作为引用i不可以对rd进行更改故应该前面➕const 改为常变量
6.4 使用场景
1. 做参数
//可以简化对指针的引用
void Swap(int left, int right)
{int temp left;left right;right temp;
}int main()
{int a0,int b1;swap(a,b);return 0;
}2. 做返回值
//传引用
int Count()
{static int n 0;n;// ... return n;
}我们曾经使用的都是传值法 例如
Swap(int x,int y)
{return xy;
}3.传值、传引用效率比较 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 当我们深入了解栈帧就会知道 return xy函数销毁时该return值存放在栈帧的寄存器上 引用 return时并不像传值返回此处返回可以认为是产生了一个n的别名可以减少拷贝节约空间 引用返回的优点体现
#include assert.h#define N 10
typedef struct Array
{int a[N];int size;
}AY;//引用返回
//1减少拷贝
//2调用者可以修改返回对象
int PosAt(AY ay ,int i)
{assert(iN);return ay.a[i];//此处返回的就是a的第i个位置的别名
}int main()
{int retCount();AY ay;for (int i 0; i N; i){PosAt(ay,i)i*10;}for (int i 0; i N; i){coutPosAt(ay,i) ;}coutendl;return 0;
}6.5引用问题举例
举例
int Add(int a, int b)
{int c a b;return c;
}int main()
{int ret Add(1, 2);//Add(3, 4);cout Add(1,2) is : ret endl;cout Add(1,2) is : ret endl;return 0;
}当然有些编译器输出的值可能是 Add(12) is : 7 Add(12) is : ~(此处为随机值) 不同的编译器可能在此处输出的值不同 但为什么会输出这样的值呢 在执行过程中 int ret Add(1, 2);此时ret n 3 若此时将下一行的 Add(3, 4);注销此时输出就可能为 3(此处为随机值或3) (此处为随机值) 原因是访问时 该空间已经被销毁不同的编译器输出结果可能不同但此方法就是错误的 这种方法语法上是可以执行的但是结果上是未定义的,本身就是错误的 在该代码基础之上对main函数进行更改怎么样都是错误的
6.6 反汇编中的 在反汇编中可以看出 -在表层上引用是不开空间的 - 在底层上引用开辟空间4字节从汇编层面上引用也是用指针实现的
6.7 引用和指针的不同点 引用概念上定义一个变量的别名指针存储一个变量地址。 引用在定义时必须初始化指针没有要求 引用在初始化时引用一个实体后就不能再引用其他实体而指针可以在任何时候指向任何一个同类型实体 没有NULL引用但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32 位平台下占4个字节) 引用自加即引用的实体增加1指针自加即指针向后偏移一个类型的大小 有多级指针但是没有多级引用 访问实体方式不同指针需要显式解引用引用编译器自己处理 引用比指针使用起来相对更安全
7.内联函数
7.1 内联函数与宏对比
以inline 修饰的函数叫内联函数 在C语言中使用定义宏#define 定义宏相关文章# C语言程序环境和预处理 定义相关define 函数 在变异阶段阶段就会进行读写使用时容易出现bug 若定义一个xy的宏
#define Add(x,y) ((x)(y))宏函数的错误写法
#define Add(int x, int y) return x y;
#define Add(x, y) x y;
#define Add(x, y) (x y);
#define Add(x, y) (x) (y);相比内联函数定义宏的缺点是宏定义函数相比内联函数的缺点包括可读性差、难以调试、没有类型安全的检查、占用更多内存、可能引发副作用、排查错误困难和缺乏类型检查等等。 内联函数的优点 9. 减少函数调用开销。 10. 减少函数体积节省代码存储空间。 11. 提高指令缓存命中率。 12. 消除函数调用的运行时开销。
7.2 内联函数
使用lnline内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率
inline int Add(int x,int y)
{return xy;
}内敛是以空间(编译出来的可执行程序会变大非运行时占用内存变大)换时间的做法 假设1000个调用swap的地方: swap不是inline swap调用swap指令合计是101000 swap是inline swap调用swap指令合计是 1*1000 7.2内联函数的特性
inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷:可能会使目标文件变大优势:少了调用开销提高程序运 行效率。inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议:将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到。 // F.h
#include iostream
using namespace std;
inline void f(int i);// F.cpp
#include F.h
void f(int i)
{cout i endl;
}// main.cpp
#include F.h
int main()
{f(10);return 0;
}
// 链接错误:main.obj : error LNK2019:
//无法解析的外部符号 void __cdecl f(int)
//(?fYAXHZ)该符号在函数 _main 中被引用8. auto关键字
auto 关键字是用来进行类型推断的。在 C11 标准引入之前我们需要显式地声明变量的类型例如 int、double 等。而使用 auto 关键字则可以根据变量的初始值自动推断出其类型。
auto 关键字的使用可以简化代码提高代码的可读性和可维护性。特别是在定义复杂类型或迭代器类型时使用 auto 可以避免重复编写类型名称减少代码冗余。
【注意】 使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编 译期会将auto替换为变量实际的类型 typedef相比于auto的缺点
typedef char* pstring;
int main()
{
const pstring p1;// 编译成功还是失败?
const pstring* p2;// 编译成功还是失败?
return 0;
}p1失败 正确写法
const pstring p1nullptr;
const pstring* p2;auto的使用细则
1. auto与指针和引用结合起来使用
用auto声明指针类型时用auto和auto*没有任何区别但用auto声明引用类型时则必须 加 遍历数组
//曾今的方法
int array[] {1, 2, 3, 4, 5, 6};
for (int i 0; i sizeof(array) / sizeof(int); i)
{cout array[i] ;
}cout endl;// 遍历数组新方式:
// 范围for--语法糖 自动依次取数组中数据赋值给e对象
//自动判断结束
for (auto e : array)
{cout e ;
}
cout endl;2. 在同一行定义多个变量
当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。
void TestAuto()
{auto a 1, b 2;auto c 3, d 4.0;// 该行代码会编译失败因为c和d的初始化表达式类型不同
}3.auto不能推导的场景
auto不能作为函数的参数
// 此处代码编译失败auto不能作为形参类型
//因为编译器无法对a的实际类型进行推导
void TestAuto(auto a)
{
}auto不能直接用来声明数组
void TestAuto()
{int a[] {1,2,3};auto b[] {456};
}为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法 auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有 lambda表达式等进行配合使用。
9.指针空值nullptr 二者的区别是什么呢 NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码: 可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。不论采取何 种定义在使用空值的指针时都不可避免的会遇到些麻烦
void f(int)
{coutf(int)endl;
}void f(int*)
{coutf(int*)endl;
}int main(){f(0);f(NULL);f((int*)NULL);return 0;
}程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的 初衷相悖。 在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器 默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void *)0。
注意:
在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入 的。在C11中sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。
本篇就到此结束啦感谢阅读创作不易若喜欢的话不妨留下一个免费的赞吧 文章转载自: http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.mnjwj.cn.gov.cn.mnjwj.cn http://www.morning.ykqbs.cn.gov.cn.ykqbs.cn http://www.morning.fjtnh.cn.gov.cn.fjtnh.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.xpgwz.cn.gov.cn.xpgwz.cn http://www.morning.rgwrl.cn.gov.cn.rgwrl.cn http://www.morning.dxhnm.cn.gov.cn.dxhnm.cn http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn http://www.morning.lmqw.cn.gov.cn.lmqw.cn http://www.morning.ltqtp.cn.gov.cn.ltqtp.cn http://www.morning.myfwb.cn.gov.cn.myfwb.cn http://www.morning.syfty.cn.gov.cn.syfty.cn http://www.morning.dydqh.cn.gov.cn.dydqh.cn http://www.morning.wwkft.cn.gov.cn.wwkft.cn http://www.morning.chehb.com.gov.cn.chehb.com http://www.morning.fjgwg.cn.gov.cn.fjgwg.cn http://www.morning.pngph.cn.gov.cn.pngph.cn http://www.morning.hsjrk.cn.gov.cn.hsjrk.cn http://www.morning.qgkcs.cn.gov.cn.qgkcs.cn http://www.morning.wnkjb.cn.gov.cn.wnkjb.cn http://www.morning.dhqzc.cn.gov.cn.dhqzc.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.kjrp.cn.gov.cn.kjrp.cn http://www.morning.phnbd.cn.gov.cn.phnbd.cn http://www.morning.ljcf.cn.gov.cn.ljcf.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.nzdks.cn.gov.cn.nzdks.cn http://www.morning.rlwcs.cn.gov.cn.rlwcs.cn http://www.morning.btjyp.cn.gov.cn.btjyp.cn http://www.morning.mngyb.cn.gov.cn.mngyb.cn http://www.morning.mmjyk.cn.gov.cn.mmjyk.cn http://www.morning.tftw.cn.gov.cn.tftw.cn http://www.morning.yqrfn.cn.gov.cn.yqrfn.cn http://www.morning.nrfrd.cn.gov.cn.nrfrd.cn http://www.morning.lpmlx.cn.gov.cn.lpmlx.cn http://www.morning.mhsmj.cn.gov.cn.mhsmj.cn http://www.morning.jlktz.cn.gov.cn.jlktz.cn http://www.morning.nssjy.cn.gov.cn.nssjy.cn http://www.morning.bpmnl.cn.gov.cn.bpmnl.cn http://www.morning.aishuxue.com.cn.gov.cn.aishuxue.com.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.bfrff.cn.gov.cn.bfrff.cn http://www.morning.yzzfl.cn.gov.cn.yzzfl.cn http://www.morning.nfnxp.cn.gov.cn.nfnxp.cn http://www.morning.fbbmg.cn.gov.cn.fbbmg.cn http://www.morning.fyskq.cn.gov.cn.fyskq.cn http://www.morning.cykqg.cn.gov.cn.cykqg.cn http://www.morning.hbdqf.cn.gov.cn.hbdqf.cn http://www.morning.incmt.com.gov.cn.incmt.com http://www.morning.rqqct.cn.gov.cn.rqqct.cn http://www.morning.hclplus.com.gov.cn.hclplus.com http://www.morning.ltspm.cn.gov.cn.ltspm.cn http://www.morning.hmhdn.cn.gov.cn.hmhdn.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.qkcyk.cn.gov.cn.qkcyk.cn http://www.morning.rkgyx.cn.gov.cn.rkgyx.cn http://www.morning.gtcym.cn.gov.cn.gtcym.cn http://www.morning.xnlj.cn.gov.cn.xnlj.cn http://www.morning.wgtr.cn.gov.cn.wgtr.cn http://www.morning.jwskq.cn.gov.cn.jwskq.cn http://www.morning.qzxb.cn.gov.cn.qzxb.cn http://www.morning.gbwfx.cn.gov.cn.gbwfx.cn http://www.morning.wztlr.cn.gov.cn.wztlr.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.lbggk.cn.gov.cn.lbggk.cn http://www.morning.mhfbp.cn.gov.cn.mhfbp.cn http://www.morning.fbmjw.cn.gov.cn.fbmjw.cn http://www.morning.zxzgr.cn.gov.cn.zxzgr.cn http://www.morning.pctql.cn.gov.cn.pctql.cn http://www.morning.czrcf.cn.gov.cn.czrcf.cn http://www.morning.qrpdk.cn.gov.cn.qrpdk.cn http://www.morning.yjfzk.cn.gov.cn.yjfzk.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.hcxhz.cn.gov.cn.hcxhz.cn http://www.morning.rtmqy.cn.gov.cn.rtmqy.cn http://www.morning.xfwnk.cn.gov.cn.xfwnk.cn http://www.morning.qqhfc.cn.gov.cn.qqhfc.cn http://www.morning.chjnb.cn.gov.cn.chjnb.cn