96SEO 2026-02-23 12:49 24
C是C语言的继承它可进行过程化程序设计又可以进行以抽象数据类型为特点的基于对象的程序设计还可以进行以继承和多态为特点的面向对象的程序设计。

引用reference就是C对C语言的重要扩充。
引用就是某一变量目标的一个别名对引用的操作与对变量直接操作完全一样。
引用的声明方法类型标识符
引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体再不能引用其他实体
ax的结果是一个临时变量临时变量具有常性const引用就可以int
这样写不可以这里const加上就可以将不同类型取别名类型转换的时候会出现一个临时变量**临时变量具有常性所以就可以~**
加上const就可以了被引用的实体不能是常量引用的类型必须相同
做参数【在我们C语言阶段的时候使用函数交换两个变量的值就需要传地址过去否则的话形参只是实参的一份临时拷贝】
}而我们学了引用这个时候就可以把指针替换下去了使用引用作为参数
C的引用对指针使用比较复杂的场景进行一些替换让代码更简单易懂但是不能完全替代指
就比如说在数据结构中学的链表指针需要改变指向引用不能改变指向这就是引用不能代替指针的原因
那java和pythone等其他语言有没有指针–没有那他们的链表是怎么实现的呢–引用本质上就是引用可以改变指向
我们再来看一个案例在我们学数据结构的时候单链表学习阶段有这这么一段代码这里的pphead必须要传二级指针有点不好理解呀
}而我们学了引用就可以这样写了加上一个引用也就是phead是plist的一份临时拷贝
可以看到传值需要8毫秒而传引用小于0毫秒小于0毫秒这里显示不出来所以显示的0
那我再次测试一下以引用作为函数的返回值类型和以值作为函数的返回值类型的性能
以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低
首先来看这段代码这段代码是将a的值返回然后ret接收没有什么问题
}这里是报了一个警告返回局部变量或临时变量的地址那么这个程序的结果是什么
上面的代码在func函数里是将a的别名返回了函数调用完会销毁这里与函数的栈帧的创建与销毁有关
在调用完函数后那块空间会被销毁然后再访问被销毁的地址会造成野引用
栈帧销毁的时候可能被清理结果可能是随机值但是在vs上是不清理的
这里接收的是引用所以我们就不需要取地址了SLPushBack(s,
s;s.Init();s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);for
}上面的代码C首先将C语言的结构体升级成了类了然后函数可以定义到类里面了在使用的时候获取值就要注意一个点必须返回引用之前不是说不能用引用返回码这里就不一样了这个malloc出来的空间是在堆上的所以可以返回返回别名后修改修改别名也就是修改原来的地址…end
对比区别的话要从两个维度来对比一个是语法一个是底层这两个不要混在一起了
}引用是别名不开空间指针是地址需要开空间这里我们上面都已经知道了~
看到在底层是开空间的引用底层是指针实现的语法含义和底层实现是背离的
引用是别名不开空间指针是地址需要开空间引用必须初始化指针可以初始化也可以不初始化引用不能改变指向指针可以引用相对更安全没有空引用但是有空指针容易出现野指针但是不容易出现野引用sizeof
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。
这个时候C就引入了一个概念inline就是把函数的运算逻辑放到里面来不进行建立栈帧
}如果在上述函数前增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的调用
在release模式下查看编译器生成的汇编代码中是否存在call
Add在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不会对代码进行优化下面是vs2022的设置)
我们再来看一个场景就是分文件定义的时候我就想在.h文件中定义一个函数
然而我在使用的时候两个文件都包含了这个头文件在编译阶段链接的时候就会报链接错误冲突的原因就是两个文件都会生成符号表进行链接有同名会冲突因为是同一个函数这咋办啊~
这里要注意内联修饰的函数比较大他是不会展开的小函数就会展开所以小函数使用内联大函数使用静态
inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。
inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。
下图为《Cprime》第五版关于inline的建议
不建议声明和定义分离分离会导致链接错误。
因为inline被展开就没有函数地址了链接就会找不到。
不方便调试宏。
因为预编译阶段进行了替换导致代码可读性差可维护性差容易误用。
没有类型安全的检查
}大家来上面的一个代码有可能看不懂但是我们只需要知道std::mapstd::string,
std::string::iterator是一个类型但是该类型太长了特别容易写错。
聪明的同学可能已经想到可以通过typedef给类型取别名比如
Map;使用typedef给类型取别名确实可以简化代码但是typedef有会遇到新的难题
}在编程时常常需要把表达式的值赋值给变量这就要求在声明变量的时候清楚地知道表达式的
类型。
然而有时候要做到这点并非那么容易因此C11给auto赋予了新的含义。
在早期C/C中auto的含义是使用auto修饰的变量是具有自动存储器的局部变量但遗憾的是一直没有人去使用它大家可思考下为什么
C11中标准委员会赋予了auto全新的含义即auto不再是一个存储类型指示符而是作为一个新的类型指示符来指示编译器auto声明的变量必须由编译器在编译时期推导而得。
使用auto定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
因此auto并非是一种“类型”的声明而是一个类型声明时的“占位符”编译器在编译期会将auto替换为变量实际的类型。
用auto声明指针类型时用auto和auto*没有任何区别但用
当在同一行声明多个变量时这些变量必须是相同的类型否则编译器将会报错因为编译器实际只对第一个类型进行推导然后用推导出来的类型定义其他变量。
此处代码编译失败auto不能作为形参类型因为编译器无法对a的实际类型进行推导
}为了避免与C98中的auto发生混淆C11只保留了auto作为类型指示符的用法auto在实际中最常见的优势用法就是跟以后会讲到的C11提供的新式for循环还有
}对于一个有范围的集合而言由程序员来说明循环的范围是多余的有时候还会容易犯错误。
因此C11中引入了基于范围的for循环。
for循环后的括号由冒号“
”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围。
}注意与普通循环类似可以用continue来结束本次循环也可以用break来跳出整个循环。
9.2
对于数组而言就是数组中第一个元素和最后一个元素的范围对于类而言应该提供begin和end的方法begin和end就是for循环迭代的范围。
}迭代的对象要实现和的操作。
(关于迭代器这个问题以后会讲现在提一下没办法讲清楚现在大家了解一下就可以了)
在良好的C/C编程习惯中声明一个变量时最好给该变量一个合适的初始值否则可能会出现不可预料的错误比如未初始化的指针。
如果一个指针没有合法的指向我们基本都是按照如下方式对其进行初始化
}NULL实际是一个宏在传统的C头文件(stddef.h)中可以看到如下代码
可以看到NULL可能被定义为字面常量0或者被定义为无类型指针(void*)的常量。
不论采取何种定义在使用空值的指针时都不可避免的会遇到一些麻烦比如
{f(0);f(NULL);f((int*)NULL);return
}程序本意是想通过f(NULL)调用指针版本的f(int*)函数但是由于NULL被定义成0因此与程序的初衷相悖。
在C98中字面常量0既可以是一个整形数字也可以是无类型的指针(void*)常量但是编译器默认情况下将其看成是一个整形常量如果要将其按照指针方式来使用必须对其进行强转(void*)0。
在使用nullptr表示指针空值时不需要包含头文件因为nullptr是C11作为新关键字引入的。
在C11中sizeof(nullptr)
sizeof((void*)0)所占的字节数相同。
为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr。
本文章重点介绍了引用内联函数的注意事项以及使用提了一下auto关键字和空指针问题能看完的烙铁相信已经学会了最后请多多指教如有疑问请在评论区或私信交流~~
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback