指针主要分:

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

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

指向数组的一级指针很简单了: 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. Windows下虚拟机安装Mac OS X ----- VM12安装Mac OS X 10.11

    Windows下虚拟机安装Mac OS X -– VM12安装Mac OS X 10.11 随着Iphone在国内大行其道,越来越多的开发者涌入iOS开发大军 中,但都苦于没有苹果机,本文即将介绍WI ...

  2. iOS——关于打印控件

    20.UIPrintFormatterUIPrintFormatter时打印格式化的抽象基类:展示了传统的可打印的内容对象可以跨页边界.由于打印格式化,打印系统,可以自动打印与打印格式化的内容相关联的 ...

  3. 在茫茫人海中发现相似的你——局部敏感哈希(LSH)

    一.引入 在做微博文本挖掘的时候,会发现很多微博是高度相似的,因为大量的微博都是转发其他人的微博,并且没有添加评论,导致很多数据是重复或者高度相似的.这给我们进行数据处理带来很大的困扰,我们得想办法把 ...

  4. Mongodb使用基本之——安装

    版本是:Mongodb 3.2.1 本来是想用python做个爬虫然后爬取一些数据放到数据库上的,想着想着以为NoSQL会很流行,就用了Mongodb,结果,一折腾真是不容易. 遇到的第一个问题:官网 ...

  5. Git.Framework 框架随手记--准备工作

    前面已经提到过了本框架的由来,时至今日该框架已经和最初版本有了天壤之别.因为仍有部分代码是采用原有的框架,所以本框架也算不上原创,只是在原有的基础上不断的改进,所以希望了解此框架的人不要过多的指责. ...

  6. 定一个小目标:明年1024能成功转行web前端,光荣地成为一个程序员!

    第一次在博客园写博,我为什么要选择这里吗? 据说博客园这里的IT大牛如云,作为一个求知若渴的小白,我屁颠屁颠的跟着过来了. 于是今天早上兴高采烈的注册了账号,迫不及待的打开我的博客,呃!注册账号成功了 ...

  7. navjs

    'use strict';define([ 'jquery'], function($) { var nav = { init : function() { $("#burger-menu& ...

  8. dell r710 服务器配置RAID5(3块硬盘做RAID5,另外再弄一块做数据冗余盘)

    本文完全转载于:http://www.jb51.net/article/53814.htm,只为做笔记使用 ①4块硬盘做成RAID5 ②3块硬盘做RAID5,一块硬盘做热备盘 这两种配置之间的区别.大 ...

  9. JS_工厂模式

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  10. 关于obj和基本类通过函数参数传进去执行是否改变原来的值

    var obj = { p1 : 1, p2 : 2 }; (function(_/* 这个东东是地址的应用哦 */){ _.p1 = 3, _.p2 = 4 })(obj) var i = 2; ( ...