iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++引用的特点及与指针的区别是什么
  • 884
分享到

C++引用的特点及与指针的区别是什么

2023-06-30 15:06:46 884人浏览 泡泡鱼
摘要

这篇文章主要讲解了“c++引用的特点及与指针的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++引用的特点及与指针的区别是什么”吧!一.引入在生活中,我们可能也会给一些同学起外号

这篇文章主要讲解了“c++引用的特点及与指针的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++引用的特点及与指针的区别是什么”吧!

一.引入

在生活中,我们可能也会给一些同学起外号,以“张磊”同学为例,我们可以叫他“张三石”,当我们叫到这个外号的时候就会自然而然的想到“张磊”同学,”张三石”就是张磊的别名,而引用也可以这样简单理解:在语法层面上,引用就是取别名。

二.C++中较为麻烦的运算符

C++中的 * 和 & 有多重含义,在不同的使用条件下有不同的意思:

*

int *p = &a;   /1.指针a = a * b;     /2.乘法*p = 100;      /3.指向

&

int c = a&b;    /1.位运算 转换为二进制int *p = &a;    /2.取地址int  a = 100;int & ar = a;   /3.引用

三.引用的定义

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它与引用的变量共用同一块内存空间。

格式如下:

类型 & 引用变量名(对象名) = 引用实体

注意这里的空格是可选的,即

  • &符号与前后均可以有一个空格;如下:int & ra=a;

  • &符号与类型挨着,如下:int& ra=a;

  • &符号与引用名称挨着,如下:int &ra=a;

int main(){int a =100; \\定义变量名int b = a;\\将a的值赋给变量int &c = a;\\引用 将c作为a的别名 c11中成为左值引用return 0;}

在这里就是相当于一个实体取了两个名字分别为a和c,并且在这个空间中不开辟新的空间。

C++引用的特点及与指针的区别是什么

四.引用的特点

  • 定义引用时必须给初始化

  • 没有空引用

  • 没有所谓的二级引用

  • 一个变量可以有多个引用(就相当于一个变量有好几个别名,这是可以的)

说明:

int main(){int a = 10;int& b = a;int& x;int& y = NULL;int&& c = a;}

C++引用的特点及与指针的区别是什么

总而言之:

引用本身是一个变量,但是这个变量又仅仅是另外一个变量一个别名,它不占用内存空间,它不是指针哦!仅仅是一个别名!

五.对比指针与引用

我们以交换函数为例

使用指针交换两个整型值:

int my _swap (int*ap, int*bp){assert(ap != NULL && bp != NULL);int tmp = *ap;*ap = *bp;*bp = *ap;}int main(){int x = 10, y = 20;my_swap{&x,&y);cout<< "x = " << x << " y = " << y << endl;return 0;}

使用引用交换两个指针:

void my_swap (int& a,int& b){int tmp = a;a = b;b = tmp;}int main (){int x = 10, y = 20;my_swap(x,y) ;cout << " x = " << x<< " y = " << y << endl;return 0;}

形参为指针时:第一句话一定要断言,必须判断空不空;并且在使用指针的时候 我们需要注意:是否为 野指针, 空指针 ,失效指针。

当我们使用引用时,不存在NULL引用,不需要判空,比指针更加安全

所以:能不使用指针就尽量不要使用指针! 

六.引用与指针的区别

1.语法层面的区别

从语法规则上讲,指针变量存储某个实例(变量或对象)的地址;

引用是某个实例的别名。

程序为指针变量分配内存区域;而不为引用分配内存区域。

int main(){int a = 10;int* ip = &a;int& b = a;  \\b是a的别名 并没有分配新的空间}

解引用是指针使用时要在前加“*”;引用可以直接使用。

int main(){int a = 10;int* ip = &a;int& b = a;  *ip = 100;//对于指针使用加“*”b = 200;  //引用不需要“*”}

指针变量的值可以发生改变,存储不同实例的地址;

引用在定义时就被初始化,之后无法改变(不能是其他实例的引用)。

int main(){int a = 10,b = 20;int* ip = &a;ip = &b ;int& c = a;c = b;   //b的值给c实则是把b的值给a,将a的值改为20}

指针变量的值可以为空(NULL,nullptr);没有空引用。

指针变量作为形参时需要测试它的合法性(判空NULL);引用不需要判空。

对指针变量使用"sizeof"得到的是指针变量的大小; 对引用变量使用"sizeof"得到的是变量的大小。

int main(){double dx = 10;double* dp = &dx;double& a = dx; printf("sizeof(dp):%d\n", sizeof(dp));printf("sizeof(a):%d", sizeof(a));}

运行结果:

C++引用的特点及与指针的区别是什么

理论上指针的级数没有限制;但引用只有一级。

即不存在引用的引用,但可以有指针的指针。

++引用与++指针的效果不一样。

例如就++操作而言:

int main()(int ar[5] = { 1,2,3,4,5 };int* ip = ar; //数组首元素地址int& b = ar[O]; //数组首元素的别名叫b++ip;  //由0下标的地址指向1下标的地址++b;  //由0下标指向1下标}

C++引用的特点及与指针的区别是什么

对引用的操作直接反应到所引用的实体(变量或对象)。对指针变量的操作,会使指针变量指向下一个实体(变量或对象)的地址;而不是改变所指实体(变量或对象)的内容。

int main()(int ar[5] = { 1,2,3,4,5 };int* ip = ar; //数组首元素地址int& b = ar[O]; //数组首元素的别名叫b++(*ip); //值由1>>2 (*ip)++; //所有表达式结束后 进行++ //有括号 先取ip的值与*结合 然后++为所指之物的++int x = *ip++;//没有括号 先将ip的值取出 与*结合 把所指之物取出(此时已与*结合完) 然后将ip取出进行++ ++后的值回写给ip 将值存储到x中//通过()提高了优先级}

不可以对函数中的局部变量或对象以引用或指针方式返回。

当变量的生存期不受函数的影响时就可以返回地址

2.汇编层面的区别

汇编层面来讲引用就是一个指针,但是引用并不是一个普通的指针是指针的语法槽,也可以看作是常性的指针 。

int main(){int a = 10;int* ip = &a;int& x = a;*ip = 100;x = 200;}

C++引用的特点及与指针的区别是什么

七.引用的其他使用

常引用

常引用实际上是一种万能引用既可以引用普通变量 ,常量,也可以引用字面常量。

(1)引用普通变量

int main(){int a = 10;int & b = a;    const int& c = a;    b += 10;    a += 10;    c += 10;    return 0;}

对于这块报错问题:是因为c是不可修改的

C++引用的特点及与指针的区别是什么

(2)引用常量

int main(){    int a = 10;    const int b =20;    int& x = a;    int& y = b;  //error 不安全    const int& y = b; //ok    const int& z =10; //ok    return 0;}

C++引用的特点及与指针的区别是什么

(3)引用字面常量

引用字面常量时,分两步走,首先定义一个临时量 去引用临时量 不是引用真实的字面常量10。

int main(){    int a = 10;    const int& z =10; //ok    //int tmp =10;    //const int &z = tmp;    return 0;}

数组引用

在引用数组时,必须知道数组的大小

int main(){    int a = 10;    int b = 10;    int ar[5] = { 1,2,3,4,5 };    int& x = ar[0];  //ok    int(&x)[5] = ar; //ok   没有[5]无法编译通过    return 0;}

指针引用

引用既然就是一个变量,那我同样也可以给指针变量取一个别名

int main(){int a = 100;int *p = &a;int * &rp = p;cout << a << endl;cout << *p << endl;cout << *rp << endl; //这里为什么要将*放在前面,因为p的类型是 int * 作为一个整体哦!!cout << p << endl;cout << rp << endl;getchar();return 0;}

我们发现这里的指针变量p和它的引用(别名)rp是完全一样的。但是由于引用的目的跟指针的目的是类似的,所以一般不需要对指针再起别名了。

感谢各位的阅读,以上就是“C++引用的特点及与指针的区别是什么”的内容了,经过本文的学习后,相信大家对C++引用的特点及与指针的区别是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C++引用的特点及与指针的区别是什么

本文链接: https://www.lsjlt.com/news/329871.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作