• C语言指针专题——使用指针要注意这些


    本文为原创,欢迎转发:

    欢迎关注微博与微信号:C语言编程技术分享

    C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题。在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中也多多注意。

    一、野指针

    野指针这个东东是经常被人提及的,其危害也是大家有目共睹的。我很早之前写过一篇文章来说明野指针的,链接是:

    C程序中可怕的野指针 - 知乎专栏

    有兴趣的朋友可以看看,这里就不多废话了!

    二、越界访问

    越界访问最常见的就是使用指针访问数组元素了。比如下面这段代码:

    #include <stdio.h>
    
    int main(void)
    {
        int number[3] = {1, 2, 3};
        int *p = NULL;
    
        p = number;
    
        for(int index = 0;index < 4; index++)
        {
            printf("%d
    ", *(p + index));
        }
    
        return 0;
    }

    代码很好理解,就是用一个指针p,逐个访问数组的每个元素,并打印出来。

    当index为3的时候,p + index此时就越出数组的长度了,那么*(p + index)访问的就是数组以外的内容,输出啥呢?看下面的输出结果:


    最后一个数字,是2293468,这是数组以外的元素。

    本例中还好,对数组以外的内容只是读取一下而已,如果是写操作的话,会发生什么,看你的人品了!


    三、指针不可相加

    两个指针相加,你见过吗?相乘呢?看下面的代码:

    #include <stdio.h>
    
    int main(void)
    {
        int number[3] = {1, 2, 3};
        int *p = NULL, *q = NULL;
    
        p = number;
        q = &number[2];
        
        printf("%d
    ", p + q);
    
        return 0;
    }

    我运行了下,报了一个错:


    先不去管这个错误,我们可以自己想想,两个指针相加,有什么意义呢?指针的值,也是一个数字,只不过这个数字是别人的一个地址,两个指针相加,就是两个地址值相加,确实没啥意义!

    但是如果两个指针相减呢?如代码中指针q减去指针p,这个就是有意义了,意义就在于两个指针相隔几个int型元素。有兴趣的朋友可以改下代码看看。

    四、多个指针指向同一个常量区域

    先上代码:

    #include <stdio.h>
    
    int main(void)
    {
        const char *p = "12345";
        const char *q = "12345";
        const char *r = "123456";
          
        printf("%d
    ", (p == q));
        printf("%d
    ", (p == r));
    
        return 0;
    }

    运行下:


    从结果中可以看到,指针p与q的值是一样的,也就是说,指针p与指针q是指向同一个字符串“12345”,而指针p与指针r就各自指向各自的字符串了。

    对于常量字符串“12345”而言,在程序期间,只有自己这一个实体,没有其它的拷贝,指针p和指针q都指向它,这样设计可以节约存储空间。

    五、小心sizeof(指针)的用法

    关于sizeof(指针),计算的是指针变量本身占用的字节数,认识不到这一点,就会闹出笑话,比如下面的程序:

    #include <stdio.h>
    
    void print(int number[])
    {
        for(int index = 0;index < sizeof(number) / sizeof(number[0]); index++)
        {
            printf("%d
    ", number[index]);
        }
    }
    
    int main(void)
    {
        int number[3] = {1, 2, 3};
        int *p = NULL;
    
        p = number;
    
        print(p);
    
        return 0;
    }

    在函数print中,原意是希望通过“sizeof(number) / sizeof(number[0])”来计算出数组的大小,来一个一个输出数组的元素。可实际上呢,根本不是。运行结果如下:


    结果只输出了一个元素。

    函数print的形参number虽然写的是数组的形式,但是实际上它是一个指针,

    sizeof(number) 计算的是指针本身占用的字节数,为4;

    sizeof(number[0])计算的是int整型变量占用的字节数,也为4;

    因此for循环只循环了一次就结束了。

    我曾经也写过一篇文章,来讲解sizeof(数组)和sizeof(指针)的区别,有兴趣的朋友可以看看:

    别混淆了sizeof(数组名)和sizeof(指针) - 知乎专栏






  • 相关阅读:
    bzoj1923 [Sdoi2010]外星千足虫(gauss)
    bzoj1013 [JSOI2008]球形空间产生器sphere(gauss)
    bzoj1013 [JSOI2008]球形空间产生器sphere(gauss)
    高斯消元(写(shui)题必备)
    随 (rand)(校内hu测10.6T1)(dp+矩阵+数论)
    随 (rand)(校内hu测10.6T1)(dp+矩阵+数论)
    题(problem)(详解10.5hu测T3:Catalan)
    题(problem)(详解10.5hu测T3:Catalan)
    高精度(模板)
    FJUT ACM 2144 并查集
  • 原文地址:https://www.cnblogs.com/itblog/p/7236544.html
Copyright © 2020-2023  润新知