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

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

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

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

一、指针和指针变量

        不少初学者没搞明白这二者的区别,以致于不少时候把二者等同了。学习

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

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

        可是不少时候咱们说指针时是代指指针变量的,这点咱们要知道。指针

 

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

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

        可是指针变量自己又是存放地址的,因此不少人会在这个地方搞不清楚,分不清何时是指针变量的地址,何时是指针变量存放的地址,尤为是在有二级指针或数组的时候。视频

 

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

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

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

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

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

正确的写法是:

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

scanf("%s",p); //注意这里不能写成"&p",由于p自己就存放了地址,不需再用取地址符了。

 

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

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

        因此咱们要用到指针来存放,这时候就很容易出错了。

◑ 错误一:

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 字符个数

    }

 

五、释放空间

 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++编程学习交流俱乐部!

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

相关文章
相关标签/搜索