`
wangminshe89
  • 浏览: 693447 次
文章分类
社区版块
存档分类
最新评论

引用与指针小节

 
阅读更多

一 引用和指针的区别:

引用是对已有名称的数据块起的一个别名,它与原先的名字作用一样,都对该数据块有操作权限,二者始终数据一致。

int a =5; int &b =a; a 与 b所指的数据都是分给5的那块。所以 &a == &b二者地址是一样的。

#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
int a= 5;
int &b =a;
if (&a == &b)
{
cout<<"Same"<<endl;//会执行到这里
}
getchar();
}

指针是申请一个地址空间来存放目标数据块的地址,他们也是对数据同一个数据快进行操作,只是它比引用多申请了一个存放地址的空间。

void main()

{

int a = 4;
int *b = NULL;
b = &a;
cin>>*b;
cout<<*b<<endl;
cout<<a<<endl;
cout<<&b<<endl;
cout<<&a<<endl;//a与b地址空间不同 a与 *b的值始终一致。

}

引用不可以这样写 int a = 5; int &b; b =a;编译时回报错 error C2530: 'b' : references must be initialized;而指针却可以先不进行赋值操作,所以引用一版没有空引用,而指针却又空指针,正常情况下 用引用的安全保障比用指针的高,用指针要经常判断是否为空指针的情况。

二 指针与引用的超能力表现

由于指针和引用都是直接对数据地址的操作,所以在使用时一定要注意指针和引用的这方面的操作。

比如

class Person
{
public:
Person():m_ID(5){};
int & GetPersonID(){return m_ID;}

private:
int m_ID;//设为私有类型
};
void main()
{
Person ps;
int& id = ps.GetPersonID();
cout<<id<<endl;
id = 3;
cout<<id<<endl;
cout<<ps.GetPersonID()<<endl;//此时ps的私有成员已经被改变为3了,这不符合我们原先定义m_ID为私有的本意;
getchar();
}

所以我们要么把函数改为

const int & GetPersonID(){return m_ID;}加上静态类型

要么就是不用引用的返回类型 而改为值传递,这样传回的就是该数据的一个副本,不会影响到私有成员的数据。

改为指针类型也一样

class Person
{
public:
Person():m_ID(5){};
int * GetPersonID(){return &m_ID;}

private:
int m_ID;//设为私有类型
};
void main()
{
Person ps;
int* id = ps.GetPersonID();
cout<<*id<<endl;
*id = 3;
cout<<*id<<endl;
cout<<*(ps.GetPersonID())<<endl;//私有成员也被改变了,解决方法与引用的相同。加上const 后编译时就会报错
getchar();
}

指针的 new 和 delete

int *p = new int(2);//在heap堆中动态申请一个整型数据的内存空间 并赋初值为2;cout<<*p<<endl; 输出2

在不用 p时 要调用 delete p; p = null,这时p指针仍然存在,只是不指向任何有效数据空间,释放p所指的内存空间,如果在释放之前 将p指向别的地址 如 p = NULL;那么p原先所指的内存空间将无法释放,而导致内存泄漏。

int *pp = new int[20];//动态申请20个整形数据空间,删除时delete []pp; pp =NULL;

表达能力有限 先记下这些把,以后再补充

分享到:
评论

相关推荐

    全国计算机等级考试 二级C语言 辅 导 第二部分: C语言程序设计

    `&`运算符用于获取变量的地址,而`*`运算符则用于解引用指针,获取指针所指向的变量的值。这两个运算符在使用时具有相同的优先级,自右向左结合。例如,`i_pointer`是一个指针变量,`*i_pointer`表示指针变量的内容...

    C++大学教程,一本适合初学者的入门教材(part1)

    5.7 指针表达式与指针算法 5.8 指针与数组的关系 5.9 指针数组 5.10 实例研究:洗牌与发牌 5.11 函数指针 5.12 字符与字符串处理简介 5.12.1 字符与字符串基础 5.12.2 字符串处理库的字符串操作函数 5.13...

    x1-文本小节-常见数据结构.md

    链表由一系列节点组成,节点之间通过指针或引用连接。每个节点包括数据和指向下一个节点的指针。链表分为单向链表和双向链表等。 - **应用场景**:链表在前端中主要用于实现列表、循环结构等。 - **数据结构示例**...

    C++大学教程,一本适合初学者的入门教材(part2)

    5.7 指针表达式与指针算法 5.8 指针与数组的关系 5.9 指针数组 5.10 实例研究:洗牌与发牌 5.11 函数指针 5.12 字符与字符串处理简介 5.12.1 字符与字符串基础 5.12.2 字符串处理库的字符串操作函数 5.13...

    C程序设计语言(英文)

    - 讨论了指针与多维数组之间的关系。 - **5.10 命令行参数** - 介绍了如何从命令行获取参数并处理这些参数。 - **5.11 指向函数的指针** - 介绍了指向函数的指针的概念及其使用方法。 - **5.12 复杂声明** - ...

    C++基础教程完整版

    - **指针**:深入讨论了指针的概念,包括指针的声明、赋值、解引用和指针运算。 - **动态内存分配**:介绍了动态内存的申请(new)和释放(delete)。 - **数据结构**:提到了结构体和联合体等复合数据类型。 - ...

    C语言程序设计基础-C++基础教程_完整版.doc

    - **指针**:解释指针的概念、声明、初始化、解引用和指针运算。 - **动态内存分配**:讲解malloc和free函数,用于在运行时分配和释放内存。 - **数据结构**:包括结构体、联合体和枚举等自定义数据结构。 - **...

    C++编程规范101条规则、准则与最佳实践PDF.rar

    第25条 正确地选择通过值、(智能)指针或者引用传递参数 46 第26条 保持重载操作符的自然语义 47 第27条 优先使用算术操作符和赋值操作符的标准形式 48 第28条 优先使用++和--的标准形式。优先调用前缀形式...

    C++基础教程

    - **指针**:深入探讨指针的使用,包括指针的声明、赋值、解引用以及指针作为函数参数。 - **动态内存分配**:介绍`new`和`delete`操作符,用于在运行时动态地分配和释放内存。 8. **数据结构**:包括结构体...

    你必须知道的495个C语言问题

    《你必须知道的495个C语言问题》是一份详尽的指南,旨在帮助学习...以上仅是《你必须知道的495个C语言问题》中声明和初始化部分的概述,每一小节都有更深入的讨论和示例,旨在帮助读者全面掌握C语言的细节和最佳实践。

    c++基础教程学习

    - **指针**:讲解了指针的声明、初始化、解引用,以及指针作为函数参数的使用。 - **动态内存分配**:使用new和delete操作符进行动态内存的申请和释放。 - **数据结构**:介绍了结构体和联合体,以及它们在C++中...

    c++基础教程

    - **指针**:讲解指针的概念、声明、赋值、解引用和指针运算,以及指针与数组、函数的关系。 - **动态内存分配**:使用new和delete操作符动态分配和释放内存。 4. **数据结构和自定义数据类型** - **数据结构**...

    C++程序设计第二版西安交通大学出版社课后习题答案

    5. **指针和引用**:探索指针作为内存地址的概念,以及引用作为别名的用法。 6. **数组和动态内存管理**:学习如何声明、初始化和操作数组,以及如何使用new和delete进行动态内存分配和释放。 7. **控制结构**:熟练...

    高质量C++ C编程指南

    - **引用与指针**:明确二者之间的差异以及应用场景。 #### 七、内存管理 **1. 内存分配方式** - **堆栈与堆**:理解两种不同的内存分配机制,合理选择。 - **动态内存管理**:使用new/delete或malloc/free进行...

Global site tag (gtag.js) - Google Analytics