• 野指针+空指针+万能指针


    2.3 指针大小

    l  使用sizeof()测量指针的大小,得到的总是:4或8

    l  sizeof()测的是指针变量指向存储地址的大小

    l  在32位平台,所有的指针(地址)都是32位(4字节)

    l  在64位平台,所有的指针(地址)都是64位(8字节)

     

           int *p1;

           int **p2;

           char *p3;

           char **p4;

           printf("sizeof(p1) = %d ", sizeof(p1));

           printf("sizeof(p2) = %d ", sizeof(p2));

           printf("sizeof(p3) = %d ", sizeof(p3));

           printf("sizeof(p4) = %d ", sizeof(p4));

           printf("sizeof(double *) = %d ", sizeof(double *));

     

    7.2.4 野指针和空指针

    指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位为4字节,64位为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

     

           int a = 100;

           int *p;

           p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义

           p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义

           *p = 1000;  //操作野指针指向未知区域,内存出问题,err

     

    但是,野指针和有效指针变量保存的都是数值,为了标志此指针变量没有指向任何变量(空闲可用),C语言中,可以把NULL赋值给此指针,这样就标志此指针为空指针,没有任何指针。

           int *p = NULL;

     

    NULL是一个值为0的宏常量:

    #define NULL    ((void *)0)

     

    7.2.5万能指针void *

    void *指针可以指向任意变量的内存空间:

           void *p = NULL;

           int a = 10;

           p = (void *)&a; //指向变量时,最好转换为void *

           //使用指针变量指向的内存时,转换为int *

           *( (int *)p ) = 11;

           printf("a = %d ", a);

     

    7.2.6 const修饰的指针变量

           int a = 100;

           int b = 200;

    //指向常量的指针

           //修饰*,指针指向内存区域不能修改,指针指向可以变

           const int *p1 = &a; //等价于int const *p1 = &a;

           //*p1 = 111; //err

           p1 = &b; //ok

    //指针常量

           //修饰p1,指针指向不能变,指针指向的内存可以修改

           int * const p2 = &a;

           //p2 = &b; //err

           *p2 = 222; //ok

    指针
    指针的定义和使用:
    1、指针:是一种数据类型 指针变量也是一种变量
    2、指针格式: 对应的数据类型 * p:指针类型变量 用来指向一个变量的地址
    3、通过指针修改变量的值
     *p = 200;
    4、指针类型在内存中的大小 : 在32位操作系统中所有指针大小都是4个字节大小 
      打印指针内存大小格式: sizeof(int *) || sizeof(p)
    5、内存按照 unsignned int 为每个一个内存分配编号
    6、讲解:
    ①定义变量 int a =10;  数值10 存在内存 为a开辟的空间中 a的地址为0xff00 
    ②定义指针 int * p = &a  指针变量p 在内存中存贮的是 a的地址 0xff00,指针变量p 在内存中的大小在32位系统中都是4个字节大小
    ③*p = 200 通过操作指针变量p 所存储的 a的地址 来改变a的值
    ④指针p 有一个自己的内存地址 指针p地址 与 定义变量a的地址 0xff00不同
     

    野指针、空指针与 万能指针
    1、野指针:野指针是指向一个未知的内存空间,可能在读写的时候出现错误。
     0-255都是系统保留的 不可以读,不可以写
    2、空指针 没有指向任何的地址(其指向0的地址)
    空制指针就是指向内存编号为零的空间,操作该内存空间会报错,一般情况空指针用于程序条件判断
    3、万能指针:void *  指针可以指向任意变量的内存空间
     
    const修饰指针
    1.通过指针修改const修饰的常量
    const int a = 10;
    int *p += &a;
    *p = 100;
    a =100;
    可以通过1级指针修改一个常量的值
     
    2.const修饰指针类型 int * 不能改变指针变量指向的内存地址的值 但是可以改变指针指向的地址 
    const int *p = &a
    p=&b
    *p = 100
    可以改变指针指向的地址
     
    3.const修饰指针变量    能改变指针指向地址的值,但不能改变指针指向的地址
     
    int * const p = &a;
    *p = 100;
     p=&b
    可以修改指针指向地址的值
     
    4.const修饰指针类型修饰指针变量  不能改变指针指向的的值 也不能改变指针指向的地址 
    const int * const *p = &a;
    *p =100;
    p = &b;
     
     

    指针和数组、指针运算:
    1、数组名是数组的首地址,这是一个常量
    2、指向数组的指针 
      格式int arr [10] = { 0 } ;  
          int * p = arr;
      当操作指针的时候 间接操作了数组 arr[i] = p[i];
    3、指针的降级操作 ,取当前地址的值:p[5]、*p 
    4、对指向数组的指针进行加减操作,可能会导致数组下标越界 。
    5、相同的类型的指针相减  结果是两个指针相差的长度
    区别:数组名通过sizeof可以求出数组大小,指针只包含数组的首地址信息
    课后练习题:输入格式:【  空格  你好 空格   】输出格式为【你好】
    指针数组
    1、存储char *类型的地址数组
     char * arr[] ={"hello","world","niao","baobei"};
    2、指针数组,它是数组,数组的每个元素都是指针类型。
    多级指针:
    1、如果二级指针前面加一个* 代表一级指针的值
    2、二级指针前面加** 代表指针指向一级指针指向地址的值,加*降维度
    3、如果n级指针在前面加n个*就是指针指向一级指针指向地址的值
     

  • 相关阅读:
    最快速度找到内存泄漏
    PostMessage与SendMessage各自的问题
    分享一个javascript alert精简框架
    SendMessage、PostMessage原理
    八款常用的 Python GUI 开发框架推荐
    大学学物理将来到底能干什么?
    私有虚函数的特点(C++和Java的机制还有所不同)
    BS与CS的比较
    Eclipse代码自动提示设置
    打印TMemo的内容到打印机
  • 原文地址:https://www.cnblogs.com/WangGuiHandsome/p/9882491.html
Copyright © 2020-2023  润新知