当前位置: 首页 > news >正文

公司推广网站建设话术wordpress 导出数据库

公司推广网站建设话术,wordpress 导出数据库,wordpress 模拟装机,网页美工设计师工资河流之所以能够到达目的地#xff0c;是因为它懂得怎样避开障碍。#x1f493;#x1f493;#x1f493; 目录 ✨说在前面 #x1f34b;知识点一#xff1a;C的发展历史 • #x1f330;1.C发展历史 • #x1f330;2.C的迭代与更新 • #x1f330;3.编程语言排… 河流之所以能够到达目的地是因为它懂得怎样避开障碍。  目录 ✨说在前面 知识点一C的发展历史 • 1.C发展历史  • 2.C的迭代与更新 • 3.编程语言排行 • 4.C在工作领域的应用 • 5.C参考文档 知识点二命名空间 • 1.namespace的价值 • 2.namespace的定义 • 3.命名空间的使用 知识点三输入、输出 知识点四缺省参数 • 1.什么是缺省参数 • 2.函数重载 知识点五引用 • 1.什么是引用 • 2.引用的特性 • 3.引用的使用 • 4.const引用 • 5.指针和引用的关系 知识点六内联函数和空指针 • 1.inline与内联函数 • 2.空指针nullptr • ✨SumUp结语 ✨说在前面 亲爱的读者们大家好我们又见面了上一篇目我们已经完结了初阶数据结构部分的学习从这一章节开始我们要开始学习一门新的编程语言—C。虽然说C有些难度但有了之前C语言的基础相信大家还是非常有把握能够把它学好的。 今天我们将要学习C的基础知识包含C的历史、命名空间、输入输出、缺省参数等等知识我们今天就解开C神秘的面纱详细剖析这一门新的编程语言吧~   博主主页传送门愿天垂怜的博客 ​ ​ 知识点一C的发展历史 • 1.C发展历史  1. 起源与早期发展 起源C起源于20世纪80年代由丹麦计算机科学家本贾尼·斯特劳斯特鲁普Bjarne Stroustrup在ATT贝尔实验室发起。当时斯特劳斯特鲁普为了解决C语言的不足开始设计一种新的编程语言这就是C的雏形。他最初称之为“C with Classes”意为带有类的C语言。正式命名1983年这种语言被正式命名为C以表示这是C语言的一种进化和扩展。 2. 标准化进程 标准化开始C的标准化工作于1989年开始并成立了一个ANSI和ISO国际标准化组织的联合标准化委员会。标准发布 1994年1月25日联合标准化委员会提出了第一个标准化草案并在保持斯特劳斯特鲁普最初定义的所有特征的同时增加了部分新特征。1998年第一个C标准C98发布其中包含了许多重要的特性如类、继承、模板和异常处理等。随后C的标准化工作继续推进相继发布了C03、C11、C14、C17和C20等多个版本。每个版本都引入了新的特性和改进使得C成为一门功能丰富的编程语言。 3. 重要里程碑 编译器问世1985年第一个可用的C编译器问世这标志着C从理论走向了实践。经典著作斯特劳斯特鲁普在C的发展过程中撰写了多部经典著作如《The C Programming Language》这些著作对C的推广和普及起到了重要作用。商业应用随着C的不断发展越来越多的商业软件开始使用C编写如Windows操作系统、浏览器IE等。 4. 未来展望 C的未来发展方向包括进一步提高语言的性能、简化语法、增加并行和异步编程的支持并继续引入更多现代编程范式的特性。随着技术的不断进步和需求的不断变化C将继续保持其强大的生命力和广泛的应用前景。 5. 关键人物 本贾尼·斯特劳斯特鲁普作为C的设计者和实现者斯特劳斯特鲁普对C的发展做出了巨大贡献。他的工作不仅推动了C的标准化进程还促进了C在各个领域的应用。 总结C的发展历史是一个不断进化和扩展的过程。从最初的“C with Classes”到如今的C20C已经发展成为一门功能强大、应用广泛的编程语言。  • 2.C的迭代与更新 时间阶段内容1998年C98C官方的第一个版本接大多数编译器都支持得到了国际标准化组织ISO和协会认可以模版方式重写C的标准库引入了STL标准模版库。2003年C03这是C标准的一个重大修订主要聚焦了语言的稳定性和兼容性。C03修正了C98中的错误和漏洞同时引入了一些新的特性和功能如tr1库。2011年C11这是一次革命性的更新增加了大量的新特性和功能使得C更像一种新语言增加了lanmbda、范围for、右值引用和移动语义、边长模板参数、STL容器和核心能指针、标准线程库等。2014年C14对C11的扩展主要是修复C11中的漏洞以及改进比如泛型的lambda的返回值类型推导二进制字面常量等。2017年C17C17进一步增强了C的功能和表达能力。这次更新引入了if constexpr等同时改进了标准库中的多个组件如string等。2020年C20C20是C历史上的有一个重要里程碑。这次更新引入了一系列新特性和改进Coroutines、概念Concepts、模块化Modules等。2023年C23C23是一个小版本更新进一步完善和改进现有特性增加了if consteval、falt_map、import std导入标准库等。2026年C26制定中... • 3.编程语言排行 • 4.C在工作领域的应用 C的应用领域服务器端、游戏引擎、机器学习引擎、音视频处理、嵌入式软件、电信设备、金融应用、基础库、操作系统、编译器、基础架构、基础工具、硬件交互等很多方面都有。 1.大型系统软件开发 如编译器、数据库、操作系统、浏览器等等 2.音视频处理 常见的音视频开源库和方案有FFmpeg、WebRTC、Mediasoup、ijkplayer音视频开发最主要的技术栈就是C。 3.PC客户端开发 一般是开发Windows上的桌面软件比如WPS之类的技术栈的话一般用C和QTQT是一个跨平台的C图形用户界面Graphical User InterfaceGUI程序。 4. 服务端开发 各种大型应用网络连接的高并发后台服务。这块Java也比较多C主要用于一些对新能要求比较高的地方。如游戏服务、流媒体服务、量化高频交易服务等。 5. 游戏引擎开发 很多游戏引擎就都是使用C开发的游戏开发要掌握C基础和数据结构学习图形学知识掌握游戏引擎和框架了解引擎实现引擎源代码可以学习UE4、Cocos2d-x等开源引擎实现。 6. 嵌入式开发 嵌入式把具有计算能力的主控板嵌入到机器装置或者电子装置的内部通过软件能够控制这些装置。比如智能手环、摄像头、扫地机器人、智能音响、门禁系统、车载系统等等粗略一点嵌入式开发主要分为嵌入式应用和嵌入式驱动开发。 7. 机器学习引擎 机器学习底层的很多算法都是用C实现的上层用python封装起来。如果你只想准备数据训练模型那么学会python基本上就够用了如果你想做机器学习系统的开发那么需要学会C。 8. 测试开发/测试 每个公司研发团队有研发就有测试测试主要分为测试开发和功能测试测试开发一般是使用一些测试工具selenium、Jmeter等设计测试用例然后写一些脚本进行自动化测试性能测试等有些还需要自行开发一些测试用具。功能测试主要是根据产品的功能设计测试用例然后手动的方式进行测试。 • 5.C参考文档 https://legacy.cplusplus.com/reference/ https://zh.cppreference.com/w/cpp https://en.cppreference.com/w/ 说明第一个链接不是C的官方文档标准也只更新到C11但是以头文件的形式呈现内容比较易看、好懂。后面两个链接分别是C官方文档的中文版和英文版信息和全更新到了最新的C标准但是相比第一个不那么易看几个文档各有优势可以结合使用。  ​ 知识点二命名空间 • 1.namespace的价值 在C/C中变量、函数和后面要学习的类都是大量存在的这些变量、函数和类的别称都存在于全局作用域中 可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。 C语言项目类似下面这样的命名冲突是普遍存在的问题C引入namespace就是为了更好地解决这样的问题。 #include stdio.h #include stdlib.hint rand 10;int main() {printf(%d\n, rand);//编译报错error C2365“rand” : 重定义以前的定义是“函数” return 0; } 由于rand函数实际上在stdlib,h头文件中已经被定义为一个函数用于生成伪随机数且代码中定义了同名的变量rand这导致了命名冲突编译器无法区分到底是想调用rand函数还是引用自己定义的变量rand。 • 2.namespace的定义 定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{ }即可{ }中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。 namespace本质是定义出一个域这个域跟全局域各自独立不同的域可以定义同名变量所以下面的rand不在冲突了。 C中的域有函数局部域全局域命名空间域类域域影响的是编译时语法查找一个变量/函数/类型出处声明或定义的逻辑有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑还会影响变量的生命周期命名空间域和类域不影响变量的声明周期。 namespace只能定义在全局当然他还可以嵌套定义。 项目工程中多文件中定义的同名namespace会认为是一个namespace不会冲突。 C标准库都放在一个叫stdstandard的命名空间中。 • 3.命名空间的使用 编译查找一个变量的声明/定义时默认只会在局部或者全局查找不会到命名空间里面去查找所以我们要使用命名空间中定义的变量/函数有三种方式 指定命名空间访问项目中推荐这种方式。 using将命名空间中某个成员展开项目中经常访问的不存在冲突的成员推荐这种方式。 展开命名空间中的全部成员项目不推荐冲突风险很大日常小练习程序为了方便推荐使用。 #include stdio.h #include stdlib.hnamespace Lilt1 {int a 10;int b 20; } namespace Lilt2 {int e 50;namespace Lilt3{int c 0;int d 30;} } //展开命名空间Lilt1 using namespace Lilt1; //部分展开Lilt2中的变量e using Lilt2::e;int main() {printf(%d\n, a);printf(%d\n, e);printf(%d\n, Lilt2::Lilt3::d);return 0; } ​ 知识点三输入、输出 iostream是Input Output Stream的缩写是标准的输入、输出流库定义了标准的输入、输出对象。 std::cin是istream类的对象它主要面向窄字符narrow charactersof type char的标准输入流。 std::endl是一个函数流插入输出时相当于插入一个换行字符加刷新缓冲区。 是流插入运算符是流提取运算符C语言还用这两个运算符做位运算符左移/右移。 使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动指定格式C的输入输出可以自动识别变量类型本质是用过函数重载实现的其实最重要的是C的流可以更好的支持自定义类型对象的输入输出。 IO流涉及类和对象、运算符重载、继承等很多面向对象的知识这些知识我们还没有讲解所以这里我们只能简单认识一下C IO流的用法之后会有一个站街专门细节讲解IO流库。 cout/cin/endl等都属于C标准库C标准库都放在一个叫stdstandard的命名空间中所以要通过命名空间的使用方式去用他们。 一般日常练习中我们可以用using namespace std实际项目开发中不建议。 这里我们没有包含stdio.h也可以使用printf和scanf在包含iostream间接包含了。VS系列编译器是这样的其他编译器不确定。 int main() {int a 0;double b 0.1;char c x;cout a b \n c \n endl;std::cout a b c std::endl;int x, y, z 0;cin x y z;cout x y z endl;return 0; } 注意 int main() {// 在io需求比较高的地方如部分大量输入的竞赛题中加上以下3行代码// 可以提高CIO效率ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);return 0; } ​ 知识点四缺省参数 • 1.什么是缺省参数 缺省参数是声明或定义时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参缺省参数分为全缺省和半缺省参数有些地方把缺省参数也叫做默认参数。 全缺省就是全部形参给缺省值半缺省就是部分形参给缺省值。C规定半缺省参数必须从右往左依次连续缺省不能间隔跳跃给缺省值。 带缺省参数的函数调用C规定必须从左往右依次给实参不能跳跃给实参。 函数声明和定义分离时缺省参数不能再函数声明和定义中同时出现规定必须在函数声明给缺省值。 #include iostream using namespace std;void Func(int a 0) {cout a endl; }//全缺省 void Func1(int a 10, int b 20, int c 30) {cout a a endl;cout b b endl;cout c c endl endl; }//半缺省 void Func2(int a, int b 10, int c 20) {cout a a endl;cout b b endl;cout c c endl endl; }int main() {Func();//没有传参时使用参数的默认值Func(10);//传参时使用指定的实参/*Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);*/Func2(100);Func2(100, 200);Func2(100, 200, 300);return 0; } 缺省参数的使用案例 #include iostream using namespace std;#include Stack.h//栈的初始化 void STInit(ST* pst, int n) {assert(pst);pst-a (STDataType*)malloc(n * sizeof(STDataType));pst-top pst-capacity 0; }int main() {//确定知道要插入1000个数据初始化时一并开好避免扩容ST s2;STInit(s2, 1000);for (int i 0; i 1000; i){STPush(s1, i);}return 0; } • 2.函数重载 C支持在同一作用域中出现同名函数但是要求这些同名函数的形参不同可以是参数个数不同或者类型不同。这样C调用就表现出了多态行为使用更加灵活。C语言是不支持同一作用域中出现同名函数的。 #include iostream using namespace std;//参数类型不同 int Add(int left, int right) {cout int Add(int left, int right) endl;return left right; } double Add(double left, double right) {cout double Add(double left, double right) endl;return left right; }//参数个数不同 void f() {cout f() endl; } void f(int a) {cout f(int a) endl; }//参数顺序不同 void f(int a, char b) {cout f(int a,char b) endl; } void f(char b, int a) {cout f(char b, int a) endl; }int main() {Add(1, 2);Add(1.1, 2.2);f();f(1);f(1, x);f(x, 1);return 0; } 注意下列两种情况 //是否为函数重载 //构成但是f()调用时会报错存在歧义编译器不知道调用谁 namespace bit1 {void f1(){cout f1() endl;} } void f1(int a 10) {cout void f1(int a 10) endl; }//是否为函数重载 //不构成返回值不能作为重载的条件 void fxx() {}int fxx() { return 0; } ​ 知识点五引用 • 1.什么是引用 引用不是新定义一个变量而是给已经存在的变量取了一个别名编译器不会为应用变量开辟内存空间它和它应用的变量共用同一块空间。比如水浒传中李逵宋江叫“铁牛”江湖人称“黑旋风”林冲外号“豹子头” 类型 引用别名 引用对象 C中为了避免引入太多的运算符会复用C语言的一些符号比如前面的和这里引用也和取地址使用了同一个符号大家注意使用方法角度区分就可以。 #include iostream using namespace std;int main() {int a 0;//引用b和c是a的别名int b a;int c a;//也可以给别名b取名d相当于还是a的别名int d b;//这里取地址我们看到的是一样的cout a endl;cout b endl;cout c endl;cout d endl;cout a endl;//d全部abcd;cout a endl;return 0; } • 2.引用的特性 引用在定义时必须初始化 #includeiostream using namespace std;int main() {int a 10;//编译报错“ra”: 必须初始化引用int ra;return 0; } 一个变量可以有多个引用 #include iostream using namespace std;int main() {int a 0;//引用b和c是a的别名int b a;int c a;//也可以给别名b取名d相当于还是a的别名int d b;return 0; } 引用一旦引用一个实体再不能引用其他实体 #includeiostream using namespace std;int main() {int a 10;int b a;int c 20;/ 这里并非让b引用c因为C引用不能改变指向//这里是⼀个赋值b c;cout a endl;cout b endl;cout c endl;return 0; } • 3.引用的使用 引用对象在实践中主要是于引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象。 引用传参跟指针传参的功能是类似的引用传参相对更方便一些。 引用返回值的场景相对比较复杂我们再这里简单讲了一下场景后续内容在类和对象章节细细道来。 引用和指针在实践中相辅相成功能有重叠性但是各有特点互相不可替代。C中的引用和其他语言的引用如Java是由很大区别的除了用法最大的点C引用定义后不能改变指向Java的引用可以改变指向。 一些主要用C代码实现版本数据结构的教材中使用C引用替代指针传参目的是简化程序避免复杂的指针但是很多同学没有学习过引用导致一头雾水。 示例1交换函数不需要再传地址 void Swap(int rx, int ry) {int temp rx;rx ry;ry temp; }int main() {int x 0;int y 2;cout x y endl;Swap(x, y);cout x y endl;return 0; } 在我们以前学习C语言学习指针的时候往往会举到这个例子就是两数互换。因为我们知道形参是实参的一份临时拷贝对形参的修改不会影响到实参。所以当我们想要修改传过去的参数时应该传参数的地址利用指针的解引用修改其对应的值。 但是现在我们有了引用。由于引用的别名和原先的变量都是同一块空间我们对一个变量的别名进行修改被引用对象也会被修改。所以我们直接传变量的别名就可以实现不需要指针而在改变引用对象时同时改变被引用对象。 示例2数据结构中用引用代替指针传参 typedef struct ListNode {int val;struct ListNode* next; }LTNode, * PNode;//指针变量也可以取别名这⾥LTNode* phead就是给指针变量取别名 //这样就不需要⽤⼆级指针了相对⽽⾔简化了程序 //void ListPushBack(LTNode** phead, int x) //void ListPushBack(LTNode* phead, int x) void ListPushBack(PNode phead, int x) {PNode newnode (PNode)malloc(sizeof(LTNode));newnode-val x;newnode-next NULL;if (phead NULL){phead newnode;}else{//...} } 和示例1一样在部分数据结构教材上使用引用代替指针的写法。但是需要注意引用不能叠加没有二级引用这样的写法所以我们不能写LTNode phead而要写LTNode* phead。 示例3引用做返回值 typedef int STDataType; typedef struct stack {STDataType* a;int top;int capacity; }Stack;//弹栈 void STPush(Stack rs, STDataType x);//初始化栈 void STInit(Stack rs, int n 4) {rs.a (STDataType*)malloc(n * sizeof(STDataType));rs.top 0;rs.capacity n; }//取栈顶数据 int STTop(stack rs) {assert(rs.top 0);return rs.a[rs.top]; }int main() {// 调用全局的stack st1;STInit(st1);STPush(st1, 1);STPush(st1, 2);cout STTop(st1) endl;//取得栈顶元素的同时还可以对栈顶元素进行操作STTop(st1) 10;cout STTop(st1) endl;return 0; } 在示例3中我们利用STTop函数直接修改了栈顶元素的值。如果我们不用int做返回值直接用int做返回值类型是没有办法实现这个功能的。因为传值返回return语句中返回值会被存储在一个临时变量中也就是返回它的拷贝而这个临时变量具有常属性无法被修改。而我们用引用作为返回值直接返回栈顶元素的别名没有中间的临时变量所以可以直接通过修改别名来修改栈顶元素的值更加地方便。   • 4.const引用 可以引用一个const对象但是必须用const引用。const引用也可以引用普通对象因为对象的访问权限在引用过程中可以缩小但不能放大。 需要注意的是类似 int rb a * 3; double d 12.34 ; int rd d; 这样的一些场景下a * 3的结果保存在一个临时对象中int rd d也是类似在类型转换中会产生临时对象存储中间值也就是说rb和rd引用的都是临时对象而C规定临时对象具有常性所以这里就触发了权限放大必须要用常引用才可以。 所谓临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象。C中把这个未命名对象叫做临时对象。 #includeiostream using namespace std;int main() {const int a 10;//int ra a;//权限被放大 errorconst int ra a;int b 20;const int rb b;//权限被缩小 okreturn 0; } 上面代码a是const常量那么a的别名ra就必须用const int ra而不能int ra否则权限就被放大这是不行的相反b是int类型的变量可以用int rb可以用const int rb如果是后者那么权限就被缩小这是可以的。 #includeiostream using namespace std;int main() {int a 10;int b 20;const int rc (a b);//(a b)的值存在临时对象中临时对象具有常属性必须用const引用double d 12.34;int i d;//隐式类型转化也会创建临时变量const int ri d;double rd d;return 0; }上面的代码中rc引用a b的和结果。对于表达式的结果会被存储在临时对象中具有常属性必须用const引用临时对象还有一种情况就是隐式类型转换在隐式类型转换的同时变量的值也会被存储在临时对象中也必须用const引用。 • 5.指针和引用的关系 C中指针和引用就像两个性格迥异的亲兄弟指针是哥哥引用是弟弟在实践中他们相辅相成功能有重叠性但是各自有自己的特点互相不可替代。 语法概念上引用是一个变量的取别名不开空间指针是存储一个变量的地址需要开空间。 引用在定义时必须初始化指针建议初始化但是在语法上不是必须的。 引用可以直接访问指向对象指针需要解引用才是访问指向对象。 sizeof中含义不同引用结果为引用类型的大小但是指针始终是地址空间所占字节个数3位平台下占4个字节64位平台下占8个字节。 指针很容易出现空指针和野指针的问题引用很少出现引用使用起来会相对安全一些。 注意引用和指针在底层是一样的 #includeiostream using namespace std;int main() {int a 10;//指针int* pa a;*pa 20;//引用int ra a;ra 30;return 0; }转到反汇编  可以发现指针和引用的汇编代码是一样的他们在底层是相同的。但是我们在使用上不需要考虑底层明确引用是不开空间指针是开空间的不要混淆。  ​ 知识点六内联函数和空指针 • 1.inline与内联函数 用inline修饰的函数叫做内联函数编译时C编译器会在调用的地方展开内联函数这样调用内联函数就不需要建立栈帧了就可以提高效率。 inline对于编译器而言只是一个建议也就是说你加了inline编译器也可以选择在调用的地方不展开不同编译器关于inline什么情况展开各不相同因为C标准没有规定这个。inline使用与频繁调用的短小函数对于递归函数代码相对多一些的函数加上inline也会被编译器忽略。 C语言实现宏函数也会在预处理时替换展开但是宏函数实现很复杂也很容易出错且不方便调试C设计了inline目的就是替代C的宏函数。 inline不建议声明和定义分离到两个文件分离会导致链接错误。因为inline被展开就没有函数地址链接时会出现报错。 VS编译器debug版本下面默认是不展开inline的这样方便调试debug版本想要展开需要设置以下两个地方 为了体现C宏函数的麻烦以实现ADD加法宏函数为例 //实现⼀个ADD宏函数的常⻅问题 #define ADD(int a, int b) return a b;#define ADD(a, b) a b;#define ADD(a, b) (a b) 上面三种写法都是错误的正确的宏函数的写法如下 #define ADD(a, b) ((a) (b)) 那么为什么不能加分号为什么要加外面的括号又为什么要加里面的括号 当我们加了分号则 cout ADD(1, 2) endl; 会被替换为 cout ((1) (2)); endl; 这会导致输出语句错误因为多了一个 如果我们没有加外面的括号则 int ret ADD(1,2) * 5; 就会被替换为 int ret (1) (2) * 5; 原本我们希望得到3 * 5的值15而没有加外面的括号导致2先和5乘运算顺序发生了改变。 如果我们没有加里面的括号则 int ret ADD(1  2, 2 | 3); 就会被替换成int ret (1  2 2 | 3); 而 和 | 的优先级位运算符的优先级是没有 来得高的所以2就会先加2变成4和我们希望的结果又不一样了。  由此可见宏函数是很麻烦的稍不留神就会导致结果不符合我们的预期而且还不报错当代码一长不好找错误的地方在哪。 为了解决这个问题我们使用了内联函数 #include iostream using namespace std;inline int Add(int x, int y) {int ret x y;return ret; }int main() {int ret Add(1, 2);cout Add(1, 2) * 5 endl;cout ret endl;return 0; } 当我们再ADD前面加上关键字inline此时ADD函数就是一个内联函数它和宏类似地在函数调用的位置直接展开。对于一般的函数编译后的指令存储在代码段中而函数中的参数和局部变量存储在函数的栈帧空间。在执行call指令时会跳转到该函数的地址执行函数体内部的指令。而对于内联函数由于直接插入在调用的位置那么它的参数和变量如果有的话将使用调用它的函数的栈帧不需要创建函数栈帧也就节省了空间提升了效率。 不过展开是由代价的。如果这个函数的代码指定很庞大或者像递归函数这样的函数对于这样的函数如果在每次调用时都展开那指令的数量将会非常多这样会使得可执行文件的大小变得很大。所以inline只是给编译器一个建议如果编译器觉得这个函数不适合内联那么它依然会像普通函数那样创建函数栈帧在链接时进行符号决议和重定位等等操作。 • 2.空指针nullptr C的空指针NULL其实是一个宏在传统的C头文件srddef.h中可以看到如下代码 #ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void*)0)#endif #endif C中NULL可能被定义为字面量0或者C中被定义为无类型指针(void*)的常量。不论采用何种定义在使用空值的指针时都不可避免的会遇到一些麻烦本想通过f(NULL)调用指针版本的f(int* ptr)函数但是由于NULL被定义成0调用了f(int x)因此与程序的初衷相悖。f((void*)NULL)调用会报错。 C11中引入nullptrnullptr是一个特殊的关键字nullptr是一种特殊类型的字面量它可以转换成其他任意类型的指针类型。使用nullptr定义空指针可以避免类型转换的问题因为nullptr只能被隐式转换成指针类型而不能被转换成整型。 #include iostream using namespace std;void f(int x) {cout f(int x) endl; }void f(int* ptr) {cout f(int* ptr) endl; }int main() {f(0);f(NULL);f((void*)0);f(nullptr);return 0; } 上面的代码中f(0)毫无疑问结果是f(int x)而f(NULL)C中NULL就是0所以也是f(int x)而C语言中NULL是((void*)0)虽然是指针类型但是是void*泛型指针而不是int*所以两者都不匹配编译器会报错。而f(nullptr)中的nullptr可以转换成其他任意类型的指针变量类型且只能是指针类型所以它的结果是f(int * ptr)。 C语言和C在void*能否隐式类型转换上存在差异 #include stdio.h int main() {void* p1 NULL;int* p2 p1;return 0; } C是兼容C语言语法的但是C在语法上会比C语言严格例如上面的代码在C语言文件下是没有问题的而C不行。其原因是因为C语言的void*可以隐式类型转换而C不行。 • ✨SumUp结语 到这里本篇文章的内容就结束了本节初步带大家了解了C这门语言的历史也给大家介绍了C的基础知识、语法。这是C的基础希望大家能够认真学习。下一章节开始我们会开始学习C中的第一大关——类和对象大家先打好基础迎接接下来的挑战希望大家继续捧场~
http://www.dnsts.com.cn/news/265417.html

相关文章:

  • 做网站 被谷歌收录大学 两学一做专题网站
  • 网站视觉设计方案广东深圳职业技术学校
  • 建站公司的服务器东莞网络优化服务商
  • 超实用网站如果安装wordpress主题
  • 做论坛网站怎么赚钱吗网站底部信息
  • 做网站模板用什么软件搜索引擎优化的主要工作
  • 生鲜网站模板西安网页制作培训机构
  • 域名不作网站用途指数函数图像及性质
  • 建设房产网站网站用哪些系统做的比较好用
  • 网站建设 试卷dedecms 如何关闭网站
  • 湖北建设科技中心网站首页西安网站建设 美科动
  • 云霄县建设局网站网络营销推广服务商
  • 网站建设虍金手指花总网上营销网站
  • 社区微网站建设方案菏泽哪家网站设计公司好
  • 网站 设计 文档静态做网站
  • icp备案通过了 怎么修改我的网站苏州建设交通职业技术学院官网
  • 奇想网站建设wordpress 3.9 wp_editor not work
  • 整网站代码 带数据 免费 下载做简历的什么客网站
  • ai生成建筑网站网上营销培训课程
  • 池州最好的网站建设网站诊断
  • 濮阳住房和城乡建设部网站移动互联网应用程序指的是什么
  • 网站出现乱码怎么办山东省建设厅招标网站首页
  • 标准型网站---北京网站建设比较大的建站公司
  • 如何创作个人网站wordpress吾爱破解版
  • 做网站需要什么学历智汇隆网站建设
  • 百度推广 网站要备案吗如何用虚拟主机建设网站
  • 网站及其建设的心得体会关于网站建设分类
  • 四川省建设厅官方网站付费推广方式有哪些
  • 德州市建设街小学网站首页editplus建设网站教学
  • 网站建设公司市场开发方案用记事本做电影介绍的网站