《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\n ",a);    //10
    *p = 12;
    printf("after  a = %d  \n",a);     //12
    
    printf("before b = %d  \n",b);   //20
    *q = 22;                     // 段错误
    printf("after b = %d   \n",b);   
    
}

  const修饰指针的4种形式。

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程界的小学生、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值