1.指针

typedef说明一种新类型名,来代替已有类型名。

a.案例:typedef char* String_t和#define String_d char *这两句在使用上的区别?

1)前者声明一个类型的别名,在编译时处理,有类型检查。后者是一个简单的替换,在预编译时处理,无类型检查。

2)String_t a,b;中a和b都是char*类型的。但是String_d a,b;中a是char*类型的,b是char类型的。

b.对 typedef string *pstring;

  const pstring cstr;的理解。

cstr是一种指针,指向string类型的const对象。但这是错误的。错误的原因在于将typede当作宏替换似的文本扩展了。声明 const pstring时,const修饰的是pstring的类型。

这是一个指针。所以该声明应该是把cstr定义为指向string类型对象的const指针。等价于:string * const cstr;  

c.void*指针。void* 指针表明该指针与一地址值相关,但是不清楚存储在该地址值上的对象类型。void*指针只支持有限的操作:

1)与另外一个指针进行比较

2)向函数传递void*指针或从函数返回void*指针。

3)给另外一个void*指针赋值。不允许使用void*指针操作他所指向的对象。当函数返回void*类型时,表示返回一个特殊指针类型。而不是返回类型为void那样表示无返回值。

d.用typedef简化函数指针的定义

typedef bool (*cmpFcn)(const string &,const string &);

该定义表示cmpFcn是一种指向函数的指针类型的名字。该指针类型为指向返回bool类型并带两个const string 引用形参的函数的指针,在要使用这种函数指针类型时,

只需直接使用cmpFcn即可,不必每次都把整个类型声明全部写出来。

在引用函数名但又没有调用该函数时,函数名将被自动解释为指向函数的指针。

bool  lengthCompare(const string &,const string &);

直接引用函数名等效于在该函数名上应用取地址操作符:

cmpFcn pf1=lengthCompare;

cmpFcn pf2=&lengthCompare;

函数指针的使用

指向函数的指针可以用于调用他所指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数。

例如: typedef bool(*cmpFcn)(const string &,const string &);

bool lengthCompare(const string &,const string &);

则:cmpFcn pf=lengthCompare;

lengthCompare("hi","bye");    //直接调用lengthCompare函数

pf("hi","bye");   //   利用函数指针调用lengthCompare函数,未使用*

(*pf)("hi","bye");   //   利用函数指针调用lengthCompare函数,使用*

函数的形参为指针和返回指向函数的指针

允许将形参定义为函数类型,但是函数的返回类型则必须是指向函数的指针,而不能是函数。具有函数类型的形参所对应的实参将被自动转换为指向相应函数类型的指针。

但是,当返回的是函数类型时,同样的转换操作将无法实现。

func f2(int);  //错误,func无法自动转换。

func* f3(int);    //正确,f3返回一个函数指针

2.引用

引用就是对象的另外一个名字。c++中规定一旦定义了引用,就必须把它跟一个变量绑定起来,并且不能修改这个绑定。

不能定义引用类型的引用,但是可以定义其他类型的引用。

使用引用和指针都可以间接的访问另外一个值,但是他们之间有几个重要的区别。

1)引用不能为空,当引用被创建时,他必须被初始化,而指针可以为空值,可以在任何时候被初始化。

2)一旦一个引用被初始化为指向一个对象,他就不能改变为对另外一个对象的引用,指针则可以在任何时候指向另外一个对象。

3)不可能有NULL引用。必须确保引用和一块合法的存储单元关联。

4)sizeof(引用)得到的是所指向变量(对象)的大小,而sizeof(指针)得到指针本身的大小。

5)给引用赋值修改的是该引用所关联的对象的值,而并不是使引用于另外一个对象的关联。

6)引用使用时不需要解引用,而指针需要解引用,引用和指针的自增(++)操作符运算意义不同。

7)如果返回动态分配的对象或内存,必须使用指针,引用可能引起内存泄漏。

8)当使用&运算符取一个引用的地址时,其值为所引用变量的地址。而对指针使用&运算,取得是指针变量的地址。

可见引用本质只是一个对象的别名。对引用别名的操作即是对本身变量的操作。

const引用

const引用是指向const对象的引用。当引用的对象是const对象时,引用也必须是const。

const int ival=1024;

const int &refVal=ival;   //正确

int& ref2=ival;  //错误

如果既要既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应该使用常引用。常引用主要用于定义一个普通变量只读属性的别名。

作为函数的传入形参,避免实参在调用函数中被意外改变。

引用做类的数据成员

引用类型数据成员的初始化有一下几个特点:

1)不能直接在构造函数中初始化,必须用到初始化列表。

2)凡是用引用类型的数据成员的类,必须定义构造函数。

案例:

class  ConstRef{

public:

ConstRef(int ii):i(ii),ci(i),ri(ii){}  //ci与ri必须在成员初始化列表中初始化,因此必须自定义构造函数,书写成员初始化列表

private:

int i;

const int ci;

int &ri;

};

对指针和引用的理解(c++)的更多相关文章

  1. Java中“指针”的解释以及对“引用”的理解

    Java中"指针"的解释以及对"引用"的理解 初学Java面对对象编程,对于一些概念还真的有点难以理解,主要是因为不由自主的联系到以前学过的C语言知识,时不时的 ...

  2. [速记]关于指针,引用和递归和解递归——C++

    在写基于二叉排序树的查找时,分为三个过程 1.二叉排序树的插入 2.二叉排序树的建立 3.基于二叉排序树的查找 其中第三部可以递归方式实现,也可以用while循环解递归,于是我想也解解第一步的递归,看 ...

  3. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  4. C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

    C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效 ...

  5. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  6. 指针和引用的区别(c/c++)

      http://blog.csdn.net/thisispan/article/details/7456169 ★ 相同点: 1. 都是地址的概念: 指针指向一块内存,它的内容是所指内存的地址:引用 ...

  7. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  8. 【转】 BSS段 数据段 代码段 堆栈 指针 vs 引用

    原文:http://blog.csdn.net/godspirits/article/details/2953721 BSS段 数据段 代码段 堆栈 (转+) 声明:大部分来自于维基百科,自由的百科全 ...

  9. C++指针的引用

    [1]指针的引用,必须加上头文件<iomanip>因为调用类setw() 对一个数据可以使用“引用”(reference)这是C++           对C的一个重要扩充,引用是一种新的 ...

随机推荐

  1. 【转】Windows Server 2008 R2下安装 .net framework3.5

    原文地址:http://hi.baidu.com/tonny_dxf/item/6831bcdc3d7c06e7b2f7777c      [你必须用角色管理工具安装.net framework3.5 ...

  2. parted 分区命令

    fdisk  是针对 MBR的分区 ,因为MBR分区空间最大不能超过2T  最多分4个主分区 , 所以parted可以修改磁盘为GPT  可以支持更大的分区,更多的分区 1  查看分区 : #part ...

  3. 使用ycsb对hbase1.4.9 benchmark

    Ycsb下载地址:https://github.com/brianfrankcooper/YCSB/releases 目前测试hbase1.4.9,因此下载ycsb-hbase14-binding-0 ...

  4. RF:RF实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性—Jason niu

    %RF:RF实现根据乳腺肿瘤特征向量高精度(better)预测肿瘤的是恶性还是良性 load data.mat a = randperm(569); Train = data(a(1:500),:); ...

  5. Strange Towers of Hanoi POJ - 1958(递推)

    题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12) 那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到 ...

  6. HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】

    <题目链接> 题目大意:鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他无法找到解决方案,速度不够快,那么他很伤心.现在,他有以下的问题.他必须捍卫一个中世纪的城市,形成了树的道路.他把战士的 ...

  7. BUG总是存在的

    遇到了一个Bug 前段时间,添加功能的时候,在其他页面的Html中(django)的python调用{{}}中不小心按多了一个空格. 这导致这个值在读取的时候,读取多了一个空格:split的时候,多分 ...

  8. elf逆向入门

    一: 在linux下进行调试时容易出现权限不够的情况:此时解决办法就是chmod 777+文件名提升权限,以实验吧debug为例,给出了简单的32elf文件,我在查看一些资料以后发现,我需要在main ...

  9. linux 硬盘分区与格式化挂载 (二)

    1. 文件系统的挂载与卸载(详见linux系统管理P406)1) 掌握挂载的定义:挂载指将一个设备(通常是存储设备)挂接到一个已存在的目录上.2) 掌握mount命令的功能:实现文件系统的挂载.3) ...

  10. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...