• C语言指针用得好犹如神助!这些使用技巧值得收藏!


            指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。

    比如JAVA;java是没有指针的,但是很多地方都用到指针,不过不对用户开放,语言的自身机制帮用户处理指针的分配释放,为的就是方便用户使用,减少错误。不过我们不能因噎废食,指针虽难,但学好了会大大提升你的编程能力。

            下面来列举一下在学习过程中指针的常见错误:

    1、指针和指针变量

            很多初学者没搞明白这两者的区别,以至于很多时候把两者等同了。

            在C语言中指针是一个概念性的东西,简单而言就是地址。

            而指针变量是变量类型,属于int,float这类的,是用来存放指针的,也就是地址。

            但是很多时候我们说指针时是代指指针变量的,这点我们要知道。

     

    2、指针变量的地址和指针变量存放的地址

            凡是变量都要有内存来存放,指针变量也不例外,它也有一个地址;

            但是指针变量本身又是存放地址的,所以很多人会在这个地方搞不清楚,分不清什么时候是指针变量的地址,什么时候是指针变量存放的地址,尤其是在有二级指针或数组的时候。

    3、没分配空间就给指针赋值

            这是初学者很容易犯的错误,我们来看一个例子。

    char*p;//定义一个指针来存放字符串

    scanf("%s",p);//会出错

            此时的指针p是没有指向任何有效的空间,看清楚是有效空间,并非是没有指向内存空间,定义的时候p就有值的了,是一个随机值,指向一个不明的内存空间,但是不合法 的,当你去访问的时候就会出错。

    正确的写法是:

    char * p=(char*)malloc(sizeof(char)*size); //size 你所需的内存大小。

    scanf("%s",p); //注意这里不能写成"&p",因为p本身就存放了地址,不需再用取地址符了。

     

    4、用到二级指针来存放字符串时没有分配到空间

            我们常用字符串数组来存放一系列的字符串,但是不能动态分配空间大小,要事先指定,这在很多时候是不行。

            所以我们要用到指针来存放,这时候就很容易出错了。

    ◑ 错误一:

    char**p;//定义一个二级指针来存放一系列字符串
    
        for(i=0;i<size;i++)//size 字符串的个数
    
        {
    
          p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
    
        }

    错误原因:p是一个二级指针用来存放一系列char*变量,但是我没有给p分配内存空间就直接用了。我只是给每一个p[i]分配了空间,但是还需要存放p[i]地址的内存空间。也就是存放每一个字符串地址的内存空间还没有分配给p.

    ◑ 错误二:

    char**p;//定义一个二级指针来存放一系列字符串
    
        p=(char**)malloc(sizeof(char*));
    
        for(i=0;i<size;i++)//size 字符串的个数
    
        {
    
          p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
    
        }

    错误原因:这是很网上多人的写法,也是很常见的一种错误,这里虽然给p分配了空间但是仅仅是分配了一个char*类型的空间,当size超过1的时候,就会出错。

    正确写法:

        char**p;//定义一个二级指针来存放一系列字符串
    
        p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存空间
    
        for(i=0;i<size;i++)//size 字符串的个数
    
        {
    
          p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
    
        }

    5、释放空间

     C语言中用free来释放空间,一般用法是:

       free(p); //这里释放的是p指向的空间,存放p的内存空间没有被释放。
    
       p=NULL; //建议加上这句

     分配空间:

        char**p;//定义一个二级指针来存放一系列字符串
    
        p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存空间
    
        for(i=0;i<size;i++)//size 字符串的个数
    
        {
    
          p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
    
        }

    释放空间正确写法:

        for(i=0;i<size;i++)
    
          free(p[i]);
    
        free(p);
    
        p=NULL;

     

    最后,不管你是转行也好,初学也罢,进阶也可,如果你想学编程~

    【值得关注】我的 C/C++编程学习交流俱乐部!

    问题答疑,学习交流,技术探讨,还有超多编程资源大全,零基础的视频也超棒~

  • 相关阅读:
    如何解决秒杀的性能问题和超卖的讨论
    Redis作者谈Redis应用场景
    Net开源工作流Roadflow的使用与集成
    VisualStudioOnline协同工作流程
    中文乱码?不,是 HTML 实体编码!(转)
    Nginx搭建反向代理服务器过程详解(转)
    2016年1月15日面试某互联网公司总结(转)
    浏览器缓存知识小结及应用(转)
    Gradle多项目配置的一个demo
    Android getResources的作用和须要注意点
  • 原文地址:https://www.cnblogs.com/huya-edu/p/14201574.html
Copyright © 2020-2023  润新知