热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++基础2017.6.20指针与引用

指针、数组与引用引用#includeusingnamespacestd;基础引用voidTestReference1(){inta1;int&ba;cout

指针、数组与引用




引用

#include
using namespace std;

//基础引用
void TestReference1(){
 int a = 1;
 int& b = a;

cout <<"a:address->" <<&a <  cout <<"b:address->" <<&b <

a &#61; 2;
 b &#61; 3;
 int& c &#61; b;// 引用一个引用变量&#xff0c;别名的别名
 cout <  //c &#61; 4;

}

//const引用
void TestReference2(){
 int d1 &#61; 4;
 const int& d2 &#61; d1;
 d1 &#61; 5;
 //d2&#61;6;  //不能给常量&#xff08;不能被修改的量&#xff09;赋值。
 cout <

const int d3 &#61; 1;
 const int & d4 &#61; d3;
 //int & d5 &#61; d3;   //常量具有常性&#xff0c;只有常引用可以引用常量,不能
 const int & d6 &#61; 5;

double d7 &#61; 1.1;
 //int& d8 &#61; d7;    //d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量,也就是说d8引用的是这个带有常性(此处1.1  则为1  常数)的临时变量&#xff0c;所以不能赋值.
 const int& d9 &#61; d7;
 cout < }

//引用做参数
//1.值传递---如果形参为非引用的传值方式&#xff0c;则生成局部临时变量接收实参的值
void swap(int left, int right){      //值传递的方式无法实现交换&#xff0c;因为传参时对于参数left,right拷贝一临时副本&#xff0c;交换的时副本值&#xff0c;因为其是
 int temp &#61; left;                //临时变量&#xff0c;函数退出便自动销毁&#xff0c;并不会影响外部left,right的值
 left &#61; right;
 right &#61; temp;
}
//2.引用传递,如果形参为引用类型&#xff0c;则形参是实参的别名
void swap1(int& left,int& right){   //使用引用的话&#xff0c;不做临时拷贝&#xff0c;&的使用说明此处只是原参数的另一个名字而已&#xff0c;所以修改时直接在原参数的基础上修改变量值
 int temp &#61; left;
 left &#61; right;
 right &#61; temp;
}

//3.指针传递
void swap2(int* left,int* right){
 int temp &#61; *left;
 *left &#61; *right;
 *right &#61; temp;
}


int main(){
 //TestReference1();
 //TestReference2();
 int rightright &#61; 5;
 int leftleft &#61; 6;
 //swap(left, right);
 //swap1(leftleft,rightright);
 swap2(&leftleft,&rightright);
 cout <  return 0;
}


引用虽方便&#xff0c;使用须谨慎&#xff1a;

&#xff08;1&#xff09;&在这里不是求地址运算&#xff0c;而是起标识作用。

&#xff08;2&#xff09;类型标识符是指目标变量的类型。

&#xff08;3&#xff09;声明引用时&#xff0c;必须同时对其进行初始化。

&#xff08;4&#xff09;引用声明完毕后&#xff0c;相当于目标变量名有两个名称&#xff0c;即该目标原名称和引用名&#xff0c;且不能再把该引用名作为其他变量名的别名。

&#xff08;5&#xff09;对引用求地址&#xff0c;就是对目标变量求地址。即引用名是目标变量名的一个别名。引用在定义上是说引用不占据任何内存空间&#xff0c;但是编译器在一般将

其实现为const指针&#xff0c;即指向位置不可变的指针&#xff0c;所以引用实际上与一般指针同样占用内存。

&#xff08;6&#xff09;不能建立引用的数组。因为数组是一个由若干个元素所组成的集合&#xff0c;所以无法建立一个由引用组成的集合&#xff0c;但是可以建立数组的引用。

&#xff08;7&#xff09;引用常见的使用用途&#xff1a;作为函数的参数、函数的返回值。

总结&#xff1a;

1. 不要返回一个临时变量的引用。

2. 如果返回对象出了当前函数的作用域依旧存在&#xff0c;则最好使用引用返回&#xff0c;因为这样更高效。


* 引用和指针的区别和联系&#xff08;笔试热点&#xff09;

1. 引用只能在定义时初始化一次&#xff0c;之后不能改变指向其它变量&#xff08;从一而终&#xff09;&#xff1b;指针变量的值可变。

2. 引用必须指向有效的变量&#xff0c;指针可以为空。

3. sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小&#xff0c;而sizeof指针是对象地址的大小。





此处对象地址占了8个字节--64位---X64编译设置-------没毛病





4. 指针和引用自增(&#43;&#43;)自减(--)意义不一样。






引用是内容自增&#xff0c;而指针则是地址值自增&#xff08;根据所指向对象的类型&#xff0c;此处是char&#xff0c;所以增了一个1&#xff0c;且地址是16进制表示&#xff0c;16*4&#61;64----没毛病&#xff09;



5. 相对而言&#xff0c;引用比指针更安全。



指针比引用更为灵活&#xff0c;但是其风险也很大。使用指针时一定要检查指针是否为空(NULL)&#xff0c;且空间回收后指针最好置

零&#xff0c;以免野指针的发生造成内存泄漏等问题


Ⅰ.引用和指针的区别和联系&#xff1a;

不同点&#xff1a;

1. 指针是一个实体&#xff0c;而引用仅是个别名&#xff1b;

 2. 引用使用时无需解引用(*)&#xff0c;指针需要解引用&#xff1b;

 3. 引用只能在定义时被初始化一次&#xff0c;之后不可变&#xff1b;指针可变&#xff1b;

 4. 引用没有 const&#xff0c;指针有 const&#xff1b;const修饰的指针不可变&#xff1b;

 5. 引用不能为空&#xff0c;指针可以为空&#xff1b;

 6. “sizeof 引用”得到的是所指向的变量(对象)的大小&#xff0c;而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小&#xff1b;

7. 指针和引用的自增(&#43;&#43;)运算意义不一样&#xff1b;

 8.从内存分配上看&#xff1a;程序为指针变量分配内存区域&#xff0c;而引用不需要分配内存区域。

★相同点&#xff1a;两者都是地址的概念&#xff0c;指针指向一块儿内存&#xff0c;其内容为所指内存的地址&#xff1b;引用是某块儿内存的别名。


Ⅱ.const在C和C&#43;&#43;中的含义&#xff08;笔试热点&#xff09;&#xff1a;

⑴C中的const&#xff0c;功能比较单一&#xff0c;较容易理解&#xff1a;
作用&#xff1a;被修饰的内容不可更改。
使用场合&#xff1a;修饰变量&#xff0c;函数参数&#xff0c;返回值等。&#xff08;c&#43;&#43;中应用场合要丰富的多&#xff09;
特点&#xff1a; 是运行时const&#xff0c;因此不能取代#define用于成为数组长度等需要编译时常量的情况。同时因为是运行时const&#xff0c;可以只定义而不初始化,而在运行时初始化。如 const int iConst;。 另外&#xff0c;在c中&#xff0c;const变量默认是外部链接&#xff0c;因此在不同的编译单元中如果有同名const变量&#xff0c;会引发命名冲突&#xff0c;编译时报错。
⑵c&#43;&#43;中的const&#xff1a;

a、非类成员const&#xff1a;

①const变量默认是内部连接的&#xff0c;因此在不同的编译单元中可以有同名的const 变量定义。

②编译时常量&#xff0c;因此可以像#define一样使用&#xff0c;而且因为上面一点&#xff0c;可以在头文件中定义const变量&#xff0c;包含的不同的cpp文件&#xff08;编译

单元&#xff09;中使用而不引起命名冲突。

③编译器默认不为const变量分配内存&#xff0c;除非&#xff1a;1. 使用 extern 申明&#xff0c; 2&#xff1a;程序中有引用const 变量的地址。

④c&#43;&#43;中临时对象/内置变量默认具有const属性。

b、类中的const&#xff1a;

①与c语言中的const一样&#xff0c;只是运行时常量&#xff0c;不能作为数组维数使用&#xff0c;即不能取代#define。在类中使用下面两种方式取代#define&#xff1a; 1&#xff1a;static const... 

2 : enum{....}//enum 不占存储空间。

②类中的const 变量占用存储空间。

③类中的const成员变量需要在构造函数初始化列表中初始化。

④const 对象&#xff1a;在该对象生命周期内&#xff0c;必须保证没有任何成员变量被改变。const对象只能调用const成员函数。

⑤const成员函数&#xff1a; void fun() const ... 不仅能被const对象调用&#xff0c;也能被非const对象调用&#xff0c;因此&#xff0c;如果确认一个任何成员函数不改

变任何成员变量&#xff0c;应该习惯性将该函数定义成const类型。

⑥如果一个对象被定义成const&#xff0c;那么该const对象“可能”会被放入到ROM当中&#xff0c;这在嵌入式开发当中有时非常重要








&#xfeff;&#xfeff;

&#xfeff;&#xfeff;

推荐阅读
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 作文记录:合并区间的技巧与应用
    本文详细记录了合并区间问题的解题技巧与应用场景。首先介绍了问题背景和题目描述,接着从排序最大值的角度探讨了解决思路,并提供了具体的程序代码及运行结果。此外,还探讨了其他可能的解决方案。最后,对整个解题过程进行了总结,为读者提供了全面的理解和参考。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 深入理解Java中的多态性概念及其应用
    多态是面向对象编程中的三大核心特性之一,与封装和继承共同构成了面向对象的基础。多态使得代码更加灵活和可扩展,封装和继承则为其提供了必要的支持。本文将深入探讨多态的概念及其在Java中的具体应用,帮助读者全面理解和掌握这一关键知识点。 ... [详细]
  • C语言中如何使用break语句强制跳出for循环及函数 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
  • Java排序算法详解:选择排序、插入排序、冒泡排序与递归实现
    本文详细解析了Java中的几种基础排序算法,包括选择排序、插入排序和冒泡排序,并探讨了递归在这些算法中的应用。选择排序通过每次找到未排序部分的最小值并将其置于已排序部分的末尾来实现;插入排序则通过逐步将每个元素插入到已排序序列的正确位置;而冒泡排序则是通过多次遍历数组,两两比较并交换相邻的元素,最终使较大的元素逐渐“冒”到数组末尾。文章还提供了具体的代码示例,帮助读者更好地理解和掌握这些算法的实现细节。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 链表作为一种与数组并列的基本数据结构,在Java中有着广泛的应用。例如,Java中的`ArrayList`基于数组实现,而`LinkedList`则是基于链表实现。链表在遍历操作时具有独特的性能特点,特别是在插入和删除节点时表现出色。本文将详细介绍单向链表的基本概念、操作方法以及在Java中的具体实现,帮助读者深入理解链表的特性和应用场景。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
author-avatar
西北孤狼2502911947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有