专做宝宝的用品网站,如皋网页设计,济南有做五合一网站公司,网站开发全栈教程【C初阶】C入门#xff08;下#xff09; #x1f955;个人主页#xff1a;开敲#x1f349; #x1f955;所属专栏#xff1a;C#x1f96d; #x1f33c;文章目录#x1f33c;
6. 引用 6.1 引用的概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率…【C初阶】C入门下 个人主页开敲 所属专栏C 文章目录
6. 引用 6.1 引用的概念 6.2 引用特性 6.3 常引用 6.4 使用场景 6.5 传值、传引用效率比较 6.6 引用和指针的区别
7. 内联函数 7.1 内联函数的概念 7.2 特性
8. 指针空值nullptr 6. 引用 6.1 引用的概念 引用不是定义一个新的变量而是给一个已有的变量取别名因此引用并不会开辟额外的空间它跟它引用的变量共用一块空间。举个简单的例子有个人名字叫张小明在家里他爸妈给他取了一个小名叫明明在学校同学们给他取了个名字叫小明这里的明明和小明都可以理解为张小明的引用它们所指向的对象都是张小明。 引用类型 引用变量名 引用实体 因为pa就是a所以改变pa的值自然也就会改变a的值因为操作pa就是在操作a 注意引用类型必须和引用对象是相同类型的 6.2 引用特性
① 引动在定义时必须初始化换句话说引用必须指向一个对象不能空引用 ② 一个变量可以有多个引用这点也很好理解就像上面的张小明在家里他爸妈叫他明明在学校同学叫他小明: ③ 引用一旦指向了某个对象则不能再更改引用的对象 6.3 常引用
① 权限放大 由此可以知道权限放大是错误的不合法的。
② 权限缩小 由此可以知道权限缩小是合法的。 6.4 使用场景
① 做参数 在过去我们学习C语言时想要将两个变量的值进行交换我们写出的交换函数是这样的 会不会觉得这样挺麻烦的又要进行取地址操作又要进行解引用操作。
现在我们学习了引用之后我们就可以这样写 能够这样写的原理就是上面说的引用是对一个变量取别名对这个别名的操作就是对变量本身的操作。
② 做返回值 6.5 传值、传引用效率比较 以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直 接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效 率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低。 6.6 引用和指针的区别 引用是变量的一个别名并不会开辟额外的空间它和它引用的对象共用一块空间对引用的操作就是对变量的操作属于直接操作而指针是一块地址它保存所指向对象的地址因此指针开辟了额外的空间对变量操作需要对指针解引用因此属于间接操作。引用在定义时必须初始化而指针初不初始化都行不能出现空引用可以出现空指针在sizeof中引用的大小就是所指向对象类型的大小而指针始终为地址所占的空间大小(32位平台下为4个字节) 总结
① 引用概念上定义一个变量的别名指针存储一个变量地址。
② 引用在定义时必须初始化指针可以不初始化
③ 引用在指向了一个对象后不能再更改而指针可以随便指向任何同一类型的对象
④ 不能出现空引用可以出现空指针
⑤ 在sizeof中的含义不同引用为指向对象类型的大小指针固定为地址的大小(32位平台下为4个字节)
⑥ 对引用的操作就是对变量的直接操作指针对变量操作需要解引用属于间接操作
⑦ 引用比指针使用起来相对更加安全
7. 内联函数 7.1 内联函数的概念 以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方将其展开(不是一定的这取决于编译器是否将其看作内联函数)没有函数调用建立的栈帧开销因此内联函数提升了运行的效率。 如上图没有使用内联函数时反汇编中会有一句call指令这说明编译器为这个函数开辟了一块栈帧产生了空间的消耗。 如上图使用内联函数后编译器会将内联函数展开因此没有了栈帧的创建。 7.2 特性
① inline是一种以空间换时间的做法如果编译器将函数当作内联函数处理在编译阶段编译器会将内联函数展开。缺陷可能会使代码量变大优点少了栈帧的创建提高了运行效率。
② inline对于编译器来说只是一种建议编译器是否会将其看作是内联函数取决于编译器本身不同的编译器判断不一样。一般当函数规模较小、非递归、函数频繁调用时可以采用inline修饰否则编译器可能不会将其看作为内联函数。下图为《C Prime》第五版对inline的建议 ③ inline不建议声明和定义分离如果将inline的声明和定义分离会导致链接错误。因为当inline被展开后就没有了地址(没有开辟栈帧)链接时就找不到它。
8. 指针空值nullptr 在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现 不可预料的错误比如未初始化的指针。如果一个指针没有合法的指向我们基本都是按照如下 方式对其进行初始化 NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码 可以看到在C中NULL为常量0在C语言中NULL为void*类型的常量。但是无论是哪种形式在使用NULL时都不可避免会遇到一些麻烦比如 可以看到func(NULL)的调用初衷是想调用第二个func但是却调用了第一个这就产生了歧义。 在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器 默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void *)0。 因此在C中我们最好使用nullptr关键字来替代NULL。nullptr是专门用于指针类型的指针而NULL即能代表常量0又能代表(void*)类型的常量出现歧义。 注意
① 在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为关键字引入的。
② 在C11中sizeof(nullptr)与sizeof((void*)0)所占字节大小相同。
③ 为了提高代码的健壮性在后续表示指针空指时最好都使用nullptr。 创作不易点个赞呗蟹蟹啦~