声明指针:

 //指针声明 * 号左右的空格是可选的,下面的定义都是正确的
int *pointer1;
int* pointer2;
int*pointer3;
int * pointer4;
//注意: pointer5 是指针而 pointer6 不是
int *pointer5, pointer6;
//pointer7 和 pointer8 都是指针
int *pointer7, *pointer8;

指针的类型和指针所指向的类型:

 //指针的类型是int*,表示为int对象的指针
//指针所指向的类型是int,表示该指针指向int对象
int *pointer1;

指针的值:

指针表示指向对象位于内存中的地址,对于32位的系统来说就是一个无符号的32位数字(最多表示4GB内存),64位系统就是一个无符号的64位数字;

取地址和取值:

取一个对象的地址使用&符号,取一个指针指向的对象的值使用*符号;

 int num = ;
int *p = #
p = ;//错误, 这是直接改变指针的指向,指向内存地址101
*p = ;//正确, 修改了num的值

空指针:

表示这个指针没有指向一块有意义的内存,对空指针应用delete是安全的。

 //没有赋值的指针
int *p;
//赋值为NULL或0的指针
int *p = NULL;
int *p = ;

指针的算术运算:

指针的加减法会以sizeof(指针指向的类型)来处理,比如:

 int num = ;
int *p = #
p++;//指针的地址指向+4之后的位置
ptr += ;//指针的地址指向+20之后的位置

指向指针的指针:

指针同样可以指向另一个指针,

 int **ptr;//指向一个int类型指针的指针

指针和数组:

数组的数组名其实可以看作一个指针,

 int array[]={,,,,,,,,,},value;
value=array[];//也可写成:value=*array;
value=array[];//也可写成:value=*(array+3);
value=array[];//也可写成:value=*(array+4);

在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。

在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。

在很多情况下,可以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数
组名是常量。

成员调用:

结构变量.成员名

(*结构指针变量).成员名

结构指针变量->成员名

const和指针

使用const修饰指针时有两种意思:一种指的是你不能修改指针本身的内容,另一种指的是你不能修改指针指向的内容。

先说指向const的指针,它的意思是指针指向的内容是不能被修改的。它有两种写法:

 const int* p;
int const* p;

可以理解为,p 是一个指针,它指向的内容是 const int 类型。p 本身不用初始化它可以指向任何标示符,但它指向的内容是不能被改变的。

再说const指针,它的意思是指针本身的值是不能被修改的。它只有一种写法:

 int* const p = 一个地址;

因为指针本身的值是不能被修改的所以它必须被初始化,这种形式可以被理解为,p 是一个指针,这个指针是指向 int 的 const 指针。它指向的值是可以被改变的如 *p=3。

最后一种情况是这个指针本身和它指向的内容都是不能被改变的:

 const int* const p=一个地址;
int const* const p=一个地址;

总结下规律:指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。

最后上一个例子:

 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1 #include <iostream>

 using namespace std;

 int main(int argc, char *argv[])
{
int a=;
int b; /*定义指向const的指针(指针指向的内容不能被修改)*/
const int* p1;
int const* p2; /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/
int* const p3=&a; /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/
const int* const p4=&a;
int const* const p5=&b; p1=p2=&a; //正确
*p1=*p2=; //不正确(指针指向的内容不能被修改) *p3=; //正确
p3=p1; //不正确(指针本身的值不能改变) p4=p5;//不正确 (指针本身和它指向的内容都是不能被改变)
*p4=*p5=; //不正确(指针本身和它指向的内容都是不能被改变) return ;
}

声明引用:

 int i = ;
int& ref = i;

引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。

指针和引用的区别:

  1. 指针是一个实体,而引用仅是个别名;
  2. 引用使用时无需解引用(*),指针需要解引用;
  3. 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终;
  4. 引用没有 const,指针有 const,const 的指针不可变;
  5. 引用不能为空,指针可以为空;
  6. “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;typeid(T) == typeid(T&) 恒为真,sizeof(T) == sizeof(T&) 恒为真,但是当引用作为成员时,其占用空间与指针相同(没找到标准的规定)。
  7. 指针和引用的自增自减(++、--)运算意义不一样。

引用的弊端:
当一个类中包含引用成员时,这个类就无法使用语言生成的默认构造函数,拷贝构造函数和赋值函数。这是因为引用不能为空,必须在构造函数中为引用成员赋值,语言默认生成的函数不具备这个功能。默认构造函数在C++中时非常重要的概念,特别是在使用STL时,因此为了默认构造函数,必须摒弃引用成员变量。

引用使用总结:

  1. 函数直接的参数传递,优先考虑引用。
  2. 函数返回值,优先考虑引用。
  3. 类的数据成员,尽量不用引用。

C++学习笔记(五):指针和引用的更多相关文章

  1. Objective-C 学习笔记(五) 指针

    Objective-C 指针 每一个变量是一个内存位置和每一个存储单元都有其定义的地址,可以使用符号(&)的运算符,它表示内存中的地址访问. a. 我们定义一个指针变量 b. 分配一个指针变量 ...

  2. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  3. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  4. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  5. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  7. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  9. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  10. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

随机推荐

  1. 201. Bitwise AND of Numbers Range

    题目: Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all num ...

  2. 敏捷开发系列之旅 第二站(走近XP极限编程)

    http://blog.csdn.net/happylee6688/article/details/21551065 上篇文章,我们探讨了什么是敏捷开发,以及敏捷开发的方法学.在这篇文章中,我们将继续 ...

  3. poj12月其他题解(未完)

    最近编程的时间比较少啊…… poj3253 就是个合并果子,各种优先队列即可(显然单调队列最优) poj3263 线段树统计每个点被覆盖了多少次即可,注意要去重 poj3625 最小生成树 poj36 ...

  4. Shell Script Tutorials (0 ~ 62)

    Tutorial-1: Introduction Tutorial-2: Shell, Kernel, Terminal & More Tutorial-3: View System Date ...

  5. Android Service即四大组件总结

    原文转载自:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Service 服务: 一个Service 是一段长 ...

  6. 剑指Offer:打印从1到最大的n位数

    题目:输入数值n,按顺序打印从1到最大的n位数,例如输入n=3,则从1,2,3,一直打印到999 陷阱:若使用循环遍历 1- 999...9 并依次输出,当位数n过大时,无论将其存入int或long或 ...

  7. C++学习笔记:指向函数的指针

    #include <stdio.h> int sum(int a, int b) { return a+b; } int minus(int a, int b) { return a-b; ...

  8. Spring中的事务管理

    事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元.这些动作要么全部完成,要么全部不起作用 事务的四个关键属性( ...

  9. [转]ASP.NET MVC Jquery Validate 表单验证的多种方式介绍

    在我们日常开发过程中,前端的表单验证很重要,如果这块处理不当,会出现很多bug .但是如果处理的好,不仅bug会很少,用户体验也会得到很大的提升.在开发过程中我们可以不借助 JS 库,自己去手写 JS ...

  10. 【原创】使用Nmon_Analyzer处理较大nmon文件的方法

    1 编写目的 进行性能测试时,测试服务器使用的操作系统是Linux或Unix时,我们一般会使用Nmon工具进行操作系统资源监控数据的收集.Nmon工具是一款非常优秀的性能监控和分析工具,它能够实时地收 ...