指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽。比如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{
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{
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

5.释放空间

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

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

分配空间:

char**p;//定义一个二级指针来存放一系列字符串
p=(char**)malloc(sizeof(char*)*size));//分配size个char*类型的内存

空间

for(i=0;i{
p[i]=(char*)malloc(sizeof(char)*len));//len 字符个数
}

释放空间正确写法:

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

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C语言指针这些使用技巧值得收藏!相关推荐

  1. 手机删除的照片如何恢复?这3个恢复小技巧值得收藏

    手机已经成为人手不离的一个工具,随时拍照更是常事,小编就有个习惯,什么东西都想拍张照,在拍照过程中,有些照片拍了好几张,就会去删掉其中一些,留下一张当时觉得最好看的那张,在这之后,又想将照片找回来,但 ...

  2. 苹果手机聊天记录恢复方法有哪些?这2个恢复技巧值得收藏

    在使用苹果手机的过程中,由于苹果手机的触屏反应过快,会导致在使用微信的时候,不小心手滑把聊天记录删除了,或者在清理微信内存的时候,误把所有聊天记录一键清空,反应过来的时候聊天记录早已不翼而飞.苹果手机 ...

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

    指针用的好犹如神助,用不好会让你叫苦连连,但大多数人是用不好指针的,所以后来的很多语言都把指针封装,屏蔽.比如JAVA,java是没有指针的,但是很多地方都用到指针,不过不对用户开放,语言的自身机制帮 ...

  4. 140个电脑技巧值得收藏

    1. 重装Windows XP不需再激活 如果你需要重装Windows XP,通常必须重新激活.事实上只要在第一次激活时,备份好Windows/System32目录中的Wpa.dbl文件,就不用再进行 ...

  5. 怎么把cad做的图分享给别人_干货在线 | 这20个CAD技巧值得收藏!

    1.Ctrl+N无效时之解决办法? 众所周知CTRL+N是新建命令,但有时候CTRL+N则出现选择面板,这时只需到OP选项里调下设置. 操作:OP(选项)-系统-右侧有一个启动(A显示启动对话框B不显 ...

  6. RAW怎么转为JPG?这些转换技巧值得收藏

    相信大多数的人,出去外面游玩时都喜欢使用相机来拍照,但是大多数相机拍出来的照片都是RAW格式,图片传到电脑时,会因为格式的不兼容而导致无法查看,这个时候我们就需要把图片的格式进行转换,例如我们将其转换 ...

  7. 最热网友收藏:深入理解C语言指针的奥秘((2007年第3周)

    2007年第3周最热网友收藏 深入理解C语言指针的奥秘(93),共121人收藏,yanglilibaobao首先收藏 我来做个好人吧,40种网站设计常用技巧(78),共440人收藏,wuzeng200 ...

  8. 精心为学弟学妹准备的C语言与C++学习路线、书籍、视频推荐和资料,值得收藏!

    C语言 有人说:"C生万物,编程之本",这一点都没有错! C语言是最接近计算机的语言,很多时间,我们都会发现,C语言是非常有必要学习的. 刚开始就是泡书,然后就是抄代码,上机调试, ...

  9. 21个值得收藏的Javascript技巧

    在本文中列出了21个值得收藏的Javascript技巧,在实际工作中,如果能适当运用,则大大提高工作效率. 1  Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscri ...

最新文章

  1. 【POCO】POCO学习总结(三)——交叉编译
  2. 前端的小玩意(5)——用dojo写的二级下拉菜单自动添加功能
  3. matlab 电磁兼容仿真软件,EMC Studio免费版
  4. 织梦DedeCMS自定义表单限制IP24小时只能提交多少次
  5. linux在mak时候出现错误,在使用yocto构建linux映像时出现“memfd戋create的静态声明跟随非静态声明”错误...
  6. 腾讯云短信服务使用记录与.NET Core C#代码分享
  7. Golang笔记—面向对象编程
  8. 2018 年的 Apache 社区不平凡:让数字来说话
  9. 使用httpclient发送get请求
  10. C++中STL-全排列
  11. AcWing 852. spfa判断负环(spfa or bellman)
  12. 试论《华严经》来历的可信
  13. 盘点各专业到古代都能干些啥
  14. 【ORA-RAC】ORA-15045: ASM file name '+DATA01' is not in reference form
  15. android报错:Only the original thread that created a view hierarchy can touch its views.
  16. Chrome 浏览器远程调试
  17. 2019网络小说十大口碑神作盘点,诡秘剑来谍影覆汉牧神学霸皆在
  18. 如何写出更优雅的代码——编程范式简述
  19. 华为有国产芯片的服务器吗,华为、飞腾扛旗,国产服务器芯片有望突破!ARM要替代x86?...
  20. 2017cad光标大小怎么调_AutoCAD 2010如何调整光标的大小?调整光标大小的方法

热门文章

  1. java 队列和堆栈_Java中的堆栈和队列
  2. 什么是JavaServer Faces(JSF)
  3. apache hadoop_春天遇见Apache Hadoop
  4. java程序打包为jar_将Java应用程序打包为一个(或胖)JAR
  5. java ee 的使用方法_改善Java EE生产支持技能的8种方法
  6. 使用Spring boot,Thymeleaf,AngularJS从零开始构建一个新的Web应用程序-第3部分
  7. web框架和后台开发_Web开发框架–第1部分:选项和标准
  8. 使用Java 8 CompletableFuture和Rx-Java Observable
  9. 使用JAXB和Jackson从XSD生成JSON模式
  10. java ee jms_Java EE6事件:JMS的轻量级替代品