zoukankan      html  css  js  c++  java
  • 这样还弄不死指针?

    厘清”指针是什么“这件事

    什么是整型变量?我认为可以说成是接收整型数据的变量。这样就可以得到指针变量的定义——

    接收指针(地址)的变量——指针就是地址,这和指针变量是两回事!!指针是个(带箭头的)16进制的数,

    而指针变量就是盛放这个数的容器。还不能理解?换句话说,地址可以看成是特殊点的数据类型,和

    整型、字符、浮点等一个地位。但是地址这厮为了弄出神秘感来,硬是给自己扣了个头衔——指针。

    其实,一个指针变量携带的信息不只是一个地址而已,还有要分配的内存大小。变量的指针(地址)属性是

    由指针符号 '*' 标识的,而内存大小是由指针变量类型标识的。

     

    指针变量初始化

    先看两段代码:

    1 int a = 10;                                int a = 10; 
    2 int *p;                                    int *p;
    3 p = &a;   //指针变量初始化                   *p = a;
    4 *p = a;   //指针初始化                       p = &a;

    哪边的代码能执行呢?


    在我的测试(linux/GCC)中,右边的代码肯定会出现”段错误”和“p未初始化“。

    指针变量初始化,是很好理解的,就是获得一个合法的内存地址。注意,地址虽然是由

    编译器随机分配的,但是初始化时分配的内存一定是合法的(否则干嘛提示”未初始化“)

    而指针初始化,就是对其指向的内存单元写数据,但这段内存单元让不让你写呢?这里就有很多问题了。


    指针初始化

    如果我们没有对指针初始化,编译器当然会做这件事。只是做得可是不近人情啊,它会随便给个地址,

    至于这个地址是不是可以访问它就不管了。这就好比它指给你个座位,可上面坐着

    一个202的俄罗斯大汉,人家会让你坐吗?

     

    如果没有初始化指针,编译会随意分配地址,总得来说有3种情况:

    1、指向NULL (0x0...),也就是空指针。 (至少是安全的)

    2、指向合法地址。 (运气真好,不过隐患最大)

    3、指向非法地址,也可叫野指针。 (可能要悲催啦)

     

    对于空指针,它指向的内存地址是肯定不能访问的,所以是安全的。

    第二种现象几乎不会发生,即使碰上了,但还是无法保证其后续内存单元是可以读写的。

    第三种情况是很麻烦的,如果它保存了系统或应用程序代码,并可写的话,后果是很严重的。但如果在PC

    开发时,还是可以把心放到肚子里的,因为操作系统肯定会down掉这段代码。如果是做嵌入式开发,特别

    是在单片机上的时候,这种现象就只能靠用户自己去避免啦。

     

    上面的东西都好理解,但是只有用的多了熟练了,才能做到避免错误。指针有很多应用,比如链表、

    队列、栈以及用链表表示文本来处理文本等,这些东西都弄通了,指针当然也就不神秘啦。

     

  • 相关阅读:
    LinuxDay10——文本处理工具sed
    设计模式原则----开放封闭原则
    模式设计原则----单一职责原则
    策略模式
    建模工具
    vs查看源码行数
    单例模式(Singleton Pattern)
    UML
    简单工厂模式(Simple Factory Pattern)
    winform ProgressBar
  • 原文地址:https://www.cnblogs.com/chenwu128/p/2706205.html
Copyright © 2011-2022 走看看