zoukankan      html  css  js  c++  java
  • 对指针的理解

    一、概念

      指针是一种数据类型,可以操作内存;

      指针本质上是地址,指向以它为地址的内存单元;

      指针变量是存放内存地址的变量。

    二、指针常量与常量指针

      char * const p:指针常量 ,本质是常量,这个指针是一个常量;
      const char *p :常量指针 ,本质是指针, 这个指针指向一个常量。

      ① const char *p  和  char const *p:   const修饰 *p,*p 只读 ,不可以修改, p 可以改变; 
      ② char * const p:                               const修饰p,p只读 ,不可以修改, *p 可以修改;
      ③ const char * const p:                     *p 和 p都是只读不可修改。

    三、指针的运算

      *   对指针指向的内存的地址进行取值操作
      &   取指针变量存放的位置
      ++   增加一个单位长度的地址
      --    减小一个单位长度的地址
      +   加一个数字表示增加数字个单位的长度的地址
      -   减一个数字表示减少数字个单位的长度的地址

    四、空指针 NULL

      可以指向任何类型对象的地址。

    五、野指针

      指向一个非法的或已销毁的内存的指针。
        ① 指针变量没有被初始化 char *p;
        ② 指针p被free或者delete之后,只是把指针所指的内存释放掉了,没有改变指针的值(置空)。
    六、万能指针

      void * 可以指向任意变量的内存空间 void指针可以和其他类型的指针任意转换 但是不能直接参与指针运算。

    七、指针与数组的区别和联系 

      ① 数组是存放多个相同类型数据的集合,指针存放的是地址。数组名可以代表存放数组的内存地址,所以数组名本质上是一个指针;
      ② 同类型指针变量可以相互赋值,数组只能一个一个元素的赋值或拷贝;
      ③ 数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下标进行访问的;
      指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存;
      ④ 数组的大小:通过sizeof(数组名)/sizeof(数据类型)计算;
      指针的大小:在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4;
      在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。

     八、指针作为函数的参数时

      ① 在声明&定义函数时,将参数定义为指针形式,在调用该函数时,传入对应的指针变量即可;
      ② 在调用指针参数的函数时,函数形参将传入的指针实参中存储的地址进行了复制,在函数内对指针所指向的内存进行直接操作,自然会修改原 实参指针 所指向的内存区域,因为这两个指针指向的内存区域一样。

    九、引用与指针的区别

      ① 引用的本质是指针 ,引用的底层实现是指针;
      ② 引用不是实体变量 ,指针是实体变量;
        void* int* char* double* 4/8
        int& char& double&
      ③ 引用变量必须初始化 ,指针变量可以初始化 也可以不初始化(野指针);
           ④ 引用变量一经初始化 ,不能再引用其它对象;
        指针初始化之后 可以改变指向 int * const p = &a;
      ⑤ 引用不可以为空引用 ,指针可以为空指针 NULL;
      ⑥ 可以声明指针的引用, 但不可以声明引用的指针;

    int *p = NULL;
    int*& rp = p;//指针的引用
    int a = 0;
    int& ra = a;
    int& *p = &ra;//不行 错误的
    int *p = &ra;

      ⑦ 可以声明指针的指针 ,但不可以声明引用的引用;

    int a = 0;
    int& ra = a;
    int&& rra = ra;//错误的
    int& rra = ra;

      ⑧ 可以声明数组的引用 ,但不可以声明引用的数组;

    int arr[5] = {};
    int (&ra)[5] = arr;//数组的引用 ra等同于arr
    int a,b,c,d,e;
    int& arr[5] = {a,b,c,d,e};//错误的 不行的

      ⑨ 万能指针 void* 没有万能引用 void&。

    十、高级指针

      ① 指针数组
        本质是数组 ,数组里的元素是指针。

    int* arr[10];
    char * str[10];

      ② 数组指针
        本质是指针 ,指针指向一个数组。

     int arr[10];
     int (*pArr)[10] = &arr;
     int brr[5][8];
     int (*pBrr)[8] = brr;
     int (*pB)[5][8] = &brr;

      ③ 函数指针
        本质是指针,  指针指向一个函数。
      ④ 指针函数
        本质是函数 ,函数返回一个指针。
      ⑤ 函数指针数组:
        本质是数组,  数组里的元素是 函数指针。

  • 相关阅读:
    获取程序Appdelegate中无需释放的特定控制器,非新建-------IOS
    IOS传值---属性传值、代理委托传值(delegate)传值、单例传值、block传值
    Tableview最后一行无法显示或者显示不全的问题IOS
    IOS中的懒加载lazyLoad
    IOS中NSUserDefaults的用法(轻量级本地数据存储)
    NSNotification与NSNotificationCenter
    洛谷2756 飞行员配对方案问题
    bzoj4551 [HEOI2016]树
    洛谷2114 bzoj3668[NOI2014]起床困难综合症
    洛谷1345 [Usaco5.4]奶牛的电信
  • 原文地址:https://www.cnblogs.com/jiangyu0331/p/11644148.html
Copyright © 2011-2022 走看看