360免费建站391199,网站首页成品,丽水建设厅网站,做网站公司西安前言 接上篇#xff0c;继续来学习C#xff0c;本篇内容大概有 引用#xff0c;inline 和 nullptr。 六、引用#xff1a; 6.1、引用的定义 引用不是新定义一个变量#xff0c;而是给已存在的变量取了一个别名#xff0c;编译器不会为引用变量开辟内存空间#xff0c;它…前言 接上篇继续来学习C本篇内容大概有 引用inline 和 nullptr。 六、引用 6.1、引用的定义 引用不是新定义一个变量而是给已存在的变量取了一个别名编译器不会为引用变量开辟内存空间它和它引用的变量公用一块内存空间。
类型 引用别名 引用对象 ;
int main()
{int a 10;int b a;//这里b是a的别名//也可以给b去别名int c b;int d c;cout a endl;cout b endl;cout c endl;cout d endl;return 0;
} 6.2、引用的特性 引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体就不能再引用其他实体 int main()
{//int b; 必须初始化int a 10;int b a;int c 9;b c;// bc ac ?return 0;
} 6.3、引用的使用 引用在实践中主要是引用参数和引用做返回值中减少拷贝提高效率和改变对象时同时改变被引用对象时同时改变被引用对象。引用传参跟指针传参功能是类似的引用传参相对更加方便一些。引用和指针在实践中相辅相成功能有重叠性但是各有特点互相不可替代。C的引用跟其他语言的引用如java是有很大区别的除了用法最大的差别C引用定义不能改变指向而java的引用可以改变指向。在一些主要用C语言代码实现版本的数据结构教材中使用C引用代替指针传参目的是简化程序避开复杂的指针。 引用作为函数参数
void Swap(int rx, int ry)
{int tmp rx;rx ry;ry tmp;
}
int main()
{int x 1, y 9;cout x y endl;Swap(x, y);cout x y endl;return 0;
}
引用作为函数返回值 例如在栈数据结构中我们取栈顶数据后直接修改
int STTop(ST rs)
{assert(rs.top 0);return rs.a[rs.top];
}int main()
{cout STTop(st1) endl;STTop(st1) 10;cout STTop(st1) endl;return 0;
} 6.4、const 引用 可以引用一个 const 对象但是必须用 const 引用。const 引用也可以引用配套对象对象的访问权限在引用过程中可以缩小但是不能放大。 const 引用需要注意类似int rb a*3; double d 13.14; int rdd;这样一些情况下 a*3的结果保存在一个临时变量中int rd d也是类似在类型转换中会产生一些临时对象存储中间值也就是 rd 与 rd引用的都是临时对象而C规定临时对象具有常性所以这里就对权限进行了放大必须要常引用才行。 这里所说的临时变量就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象C中把这个未命名的对象叫做临时对象。 int main()
{const int a 10;//这里对a访问的权限放大//int ra a;const int ra a;//这里 改变const定义的常量//ra;//ra 0;int b 1;const int rb b;//const 修饰 引用rb 不能修改常量//rb;return 0;
} 类型转换
int main()
{int a 10;const int ra 30;// 编译报错: “初始化”: 无法从“int”转换为“int ”// int rb a * 3;const int rb a * 3;double d 12.34;// 编译报错“初始化”: 无法从“double”转换为“int ”// int rd d;const int rd d;return 0;
} 6.5、指针与引用的关系 C中指针和引用在实践中它们相辅相成功能有重叠性但是它们也各有自己的特点互相不可替代。 在语法概念上引用是一个变量的取别名不开辟空间而指针是存储地址的变量要开辟空间。引用在定义时必须初始化指针建议初始化但是语法上不是必须的。引用在初始化引用时引用一个对象后就不能再引用其他对象而指针可以不断改变指向的对象。这里题外话引用就像纯爱战士(深情专一)。引用可以直接访问指向对象而指针需要解引用才是访问对象。sizeof 中含义不同引用结果为引用类型的大小而指针始终是地址空间所占字节个数32位平台下占4个字节64位平台下占8个字节。指针很容易出现空指针和野指针的情况引用很少出现引用使用起来相对安全。 七、inline 用inline修饰的函数叫做内联函数编译时C编译器会在调用的地方展开内联函数这样调用内联函数时就不需要栈帧了提高效率。inline对于编译器而言只是一个建议也就是说加了inline编译器也可以选择在调用的地方不展开不同的编译器关于inline什么情况展开各不相同因为C标准没有定义这个。inline适用于频繁调用的短小函数对于递归函数代码相对多的函数加上inline会被编译器忽略。 C语言实现宏函数也会在预处理的时候展开但是宏函数实现很复杂并且容易出错且不方便调试C设计inline目的就是代替C的宏函数。 inline不建议声明和定义分离到两个文件分离会导致连接出错。inline被展开就没有了函数的地址链接时会报错。 VS中debug版本默认不展开inline方便调试如果想要进行展开可以进行一下设置 八、nullptr 在C语言中空指针是NULL但是其实NULL是一个宏在stddef.h中
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif C中NULL可能被定义为字面常量 0或者C语言中被定义为无类型的指针void*的常量。这样在使用时都会有一些不可避免的麻烦C 11 引入了nullptrnullptr是一个特殊的关键字nullptr是一种特殊类型的字面量它可以转换成任意类型的指针类型使用nullptr定义空指针可以避免类型转换的问题因此nullptr只能被隐式的转换成指针而不能被转换成整数类型。 #includeiostream
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(int*)函数但是由于NULL被定义成0调用了f(intx)。*/f(NULL);f((int*)NULL);//f((void*)NULL);// 编译报错error C2665: “f”: 2 个重载中没有一个可以转换所有参数类型// f((void*)NULL);f(nullptr);return 0;
} 感谢各位大佬支持