zoukankan      html  css  js  c++  java
  • 《C语言笔记:指针相关(一)》

    一,野指针问题

      1,什么是野指针?

        野指针就是指针指向了一个不可知的位置(随机的、不正确的、限制访问的)。

      2,会造成什么危害?

        第一种情况,指向一个不可访问的地址(比如内核空间),会触发段错误,这种算是最好的情况。

        第二种情况,指向一个可用的但是没有什么特别意义的空间(比如说曾经使用过但已经不用了的栈空间或堆空间),这个时候程序运行不会出错,也不会对当前程序造成损害,这种情况下会掩盖你的程序,让你以为程序没有错误,其实是有问题的。

        第三种情况,指向了一个可用的空间,而且这个空间在程序中正在被使用着(比如说一个变量x),那么野指针的解引用就会刚好修改这个变量的值,导致这个变量被莫名奇妙的改变,使得程序出现离奇的错误。一般最终会导致程序崩溃,或者数据损害。这种危害是最大的。

      3,怎样避免野指针?

        常规做法:

        第一点:定义指针时,同时初始化为NULL。

        第二点:在指针解引用前,先判断这个指针是不是为NULL。

        第三点:指针使用完后,将其赋值为NULL。

        第四点:在指针赋值使用时,确保赋值的是一个可用的地址空间。

    二,const关键字和指针

      const关键字修饰变量表示这个变量时常量,是只读的,不可也不必修改的。

      const修饰局部变量时,并不是真正的不可修改,可以通过“骗过”编译器来修改其值。当修饰全局变量是便是真正不可修改。

        当修饰的是全局变量时,编译时编译器将这是被const修饰为常量的变量放在了代码段,之后便真正不可修改。

        当修饰的是局部变量时,这个变量是存放在栈中,故而只要“骗过”编译器便仍可以修改其值。

        

    #include<stdio.h>
    
    
    const int b = 20;
    
    int main()
    {
        const int a = 10;
    
        int *p = &a;
        int *q = &b;    
    
        printf("before a = %d
     ",a);    //10
        *p = 12;
        printf("after  a = %d  
    ",a);     //12
        
        printf("before b = %d  
    ",b);   //20
        *q = 22;                     // 段错误
        printf("after b = %d   
    ",b);   
        
    }

      const修饰指针的4种形式。

        第一种:const int *p,指针指向的变量不可修改。

        第二种:int const *p,同第一种指针指向的变量不可修改。

        第三种:int * const p,指针不可修改。

        第四种:const int  * const p,指针变量本身和指针指向的变量都不可修改。

        关于指针变量的理解,主要涉及到两个变量:第一个是指针变量本身(P),第二个是指针P指向的那个变量(*P)。一个const只能修饰一个变量,所以弄清这四种形式的关键就是搞清楚const放在哪个位置就是修饰谁的。 

  • 相关阅读:
    栅格系统
    JQuery
    week 4
    week 1
    js嵌套,BOM,DOM,内置对象,数组,自定义对象,正则表达式
    week 2
    case when的两种用法
    获取当前路径
    parse,tryparse区别
    parse ,tryparse 续
  • 原文地址:https://www.cnblogs.com/xuxianshen/p/13917546.html
Copyright © 2011-2022 走看看