指针主要分:

   指向单一的某个对象/变量, 用于多态或函数指针, 这个不难 - 一级指针

  其次是指向数组, 用来操作/遍历数组元素 - 一级/二级指针

指向数组的一级指针很简单了: p指向的是数组的元素, p++是指向下一个元素值, *p返回数组元素的值

二级指针也不难吧, 你只要想到: p指向的是指针, p++指向的是下一个指针, **p才能得到具体的值. 二级指针主要用在:

  1 改变数组中局部变量指针, 移动局部指针;int **pp =&p; int *p=&arr;

  2 二维字符串数组

指针常量和常量指针?

正确解释和判断const的位置即可:

指针常量:指针本身是一个常量: int * const p;

常量指针: 指向常量的指针: int const *p;

解释是"????的_ _", 然后看const的位置,和它后面跟的是什么:

比较常用的是指针常量 const p, 这个主要用在函数形参上, 使得: 安全性(形参函数内部不能让该指针指向其他对象(但可以改变指向对象的值),也不能销毁该指针)

  和效率性(函数内部不需要检查该指针)

函数指针和指针函数?

跟上面的区别方法是一样的:

函数指针: 指向函数的指针: int (*fp) (int x, int y);

指针函数: 返回指针的函数: int * func(int, int);

为什么会有这样的区别呢?是因为c/c++中的运算符的优先级和结合性:

判断表达式的计算结果, 不只是看运算符的优先级,还要看运算符的结合性:

  优先级=1的: () [] . -> 它们是左结合, 计算时/判断时,结合性: 左结合, 是从左向右看;

  优先级=2的: "所有的单目运算符: - * ++ -- ! | ~等, 结合性: 右结合, 是从右向左看

    如:char **pp=&p ;   *pp++和(*pp)++是不一样的:因为*和++都是二级运算符,优先级相同,就要看结合性,由于都是右结合,所以

   *pp++是先让pp跟++结合,由于pp指向的只是一个指针, 不是数组, 则二级指针pp本身往下移动一次,然后再取值,这个是错误的,二级指针往下再移,就移到非法地址了!

   (*pp)++:由于有了括号,所以先计算*pp,找到那个一级指针,(由于一级指针指向的是数组首地址), 这个时候,一级指针++, 就可以执行数组的下一个元素了

由于()的优先级高于*, 所以:  int * func(int, int) ,首先是func跟括号结合, 表示这是一个函数,....

             int (*fp) (int , int), 括号将*fp括起来, 而括号是左结合,所以 先计算(*fp), 因此这是一个指针 然后看后面(int, int),

          则为一个函数,...

指针函数返回地址,使用如: x=* func(1,2)

函数指针代替函数名调用函数,而且它还可以通过switch结构, 指向别的函数 y=fp(1,2) 或者: y=(*fp)(1,2);

指针和引用?

要说它们的区别的话: 在传函数形参的时候都差不多,都是传递的变量地址,

c++primer中说:

1 指针形参, 得另外创建一个变量,就是指针变量; 而引用不会再创建新的变量;

2 引用是绑定到某个对象上的, 别名, 一旦绑定,就不能再绑定其他变量,就像古代的妇女一样, 从一而终,所以引用要在定义时就要初始化,并且不能用空对象去

  初始化引用,指针则更随意, 随便指

3 最重要的区别是: 赋值: 给引用赋值, 改变的是引用绑定的对象的值, 并不改变引用本身,不改变引用的绑定关系:

      int x, y;  int &rx =x; int &ry=y;

        rx=ry;

    rx绑定的还是x,  x的值已经和y的值相同;

    而指针则很明确,改变指针, 将使指针指向新的变量, 但指针原来指向的变量的值并不改变;

数组做形参的传递?

数组名做参数,传递的只是数组名所指向的地址, 而且这个地址是不能变的, 相当于" 指针常量 int * const p; 也就是说不能: arr=&another_arr;

不可能传递一个数组,再生成一个数组拷贝, c语言的设计者(当然,传递数组拷贝还是数组地址, 取决于设计者写的编译器的解释方式)设计不可能那样低效率

数组的长度length=sizeof(arr)/sizeof(arr[0]); 不能在传递的函数中这样去求数组长度, 因为传递的是地址指针...

new所指向的指针要不要加括号?

中括号[ ] , 表示new出来的是一个对象还是多个对象,

class Doctor;

Doctor *pDoctor=new Doctor / new Doctor(); 表示的new出一个对象

delete pDoctor;

Doctor *pDoctors = new Docotor[N]/ new Doctor()[5] 表示向堆 申请new出 多个连续空间的对象出来

delete [ ] pDoctors            要delete指针时, 必须加上[ ]表示销毁的是指向 :多个对象: 的指针...

new Doctor= new Doctor() , 表示调用的是类的"默认的无参的缺省构造函数"

c/c++指针的更多相关文章

  1. TODO:Golang指针使用注意事项

    TODO:Golang指针使用注意事项 先来看简单的例子1: 输出: 1 1 例子2: 输出: 1 3 例子1是使用值传递,Add方法不会做任何改变:例子2是使用指针传递,会改变地址,从而改变地址. ...

  2. enote笔记法使用范例(2)——指针(1)智能指针

    要知道什么是智能指针,首先了解什么称为 “资源分配即初始化” what RAII:RAII—Resource Acquisition Is Initialization,即“资源分配即初始化” 在&l ...

  3. C++虚函数和函数指针一起使用

    C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> ...

  4. C++11 shared_ptr 智能指针 的使用,避免内存泄露

    多线程程序经常会遇到在某个线程A创建了一个对象,这个对象需要在线程B使用, 在没有shared_ptr时,因为线程A,B结束时间不确定,即在A或B线程先释放这个对象都有可能造成另一个线程崩溃, 所以为 ...

  5. c 数组与指针的使用注意事项

    数组变量和指针变量有一点小小的区别 所以把数组指针赋值给指针变量的时候千万要小心 加入把数组赋值给指针变量,指针变量只会包含数组的地址信息 而对数组的长度一无所知 相当于指针丢失了一部分信息,我们把这 ...

  6. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  7. C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 class Point { public: Point(int xVal = 0, int yVal = 0) : x(xVal), y(yVal) { ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. 智能指针shared_ptr的用法

    为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈 ...

  10. 智能指针unique_ptr的用法

    unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...

随机推荐

  1. Java集合---HashSet的源码分析

    一.  HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.  ...

  2. 集中式版本控制系统:从svn到tfs

    06年进公司的时候,我们没有使用版本控制系统,所有代码都在部门经理的电脑上放着,谁要改什么代码就过去要一份最新的,改好之后再放回去,感觉好原始.据说之前是用过一段时间微软的vss(visual.sou ...

  3. 超全!iOS 面试题汇总

    之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删) 1. Object-c的类可以多重继承么?可以实现多个接口么?Cat ...

  4. iOS开发UI篇—popoverController简单介绍(ipad)

    一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIVi ...

  5. 5.HBase In Action 第一章-HBase简介(1.1.3 HBase的兴起)

    Pretend that you're working on an open source project for searching the web by crawling websites and ...

  6. 每个Android开发者都应该了解的资源列表

    前言   这是一篇译文,原文地址Resources every Android developer must know,在译文开头,推荐两篇同样适合于Android开发者阅读的资源列表Android开 ...

  7. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 , , , , , , , , , , }; //不重复元素 var unique = arr.GroupBy(i => i) .Where ...

  8. javascript继承(六)—实现多继承

    在上一篇javascript继承—prototype最优两种继承(空函数和循环拷贝)(3) ,介绍了js较完美继承的两种实现方案,那么下面来探讨一下js里是否有多继承,如何实现多继承.在这里可以看看j ...

  9. 第四课:seajs的模块编译_compile过程

    最近比较闲,我就讲下seajs的模块编译_compile过程. 这里紧接着第三课的例子来讲解.首先是a.js的编译 Module.prototype._compile = function() { 1 ...

  10. 使用git管理代码的心得

    一.简易使用流程 首先下载安装git,点击Git Bash进入编辑界面,之后如下图进入目录并通过命令 git init 把这个目录变成git可以管理的仓库 接下来使用git add .命令将所有文件添 ...