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

{

  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

    {

      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

  {

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

  }

释放空间正确写法:

  for(i=0;i<size;i++)

    free(p[i]);

  free(p);

  p=NULL;

声明:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wso2_使用WSO2开发

wso2几个月以来&#xff0c;我又开始使用WSO2产品。 在接下来的文章中&#xff0c;我描述了我遇到的一些&#xff08;小&#xff09;问题以及如何解决它们。 设置开发环境时&#xff0c;我要做的第一件事是在Mac上下载Developer Studi o&#xff08;64位版本&#xff09;。 解…

python数据获取手段包括哪些_python开发应用-本地数据获取方法

文件的打开、读写和关闭文件的打开&#xff1a;file_objopen(filename,moder,buffering-1,...)filename是强制参数mode是可选参数&#xff0c;默认值是rbuffering是可选参数&#xff0c;默认值为-1(0代表不缓冲&#xff0c;1或大于1的值表示缓冲一行或指定缓冲区大小)f1open(e:…

有意思的C语言运算符

在C语言中&#xff0c;运算符用于执行程序代码运算&#xff0c;会针对两个或者两个以上操作数进行运算。比如&#xff1a;5 - 2&#xff0c;它的操作数是 5 和 2&#xff0c;而运算符则是 “-”。常见的运算符可大致分为 4 种类型&#xff1a;算术运算符、关系运算符、赋值运算…

java反向映射_opencv 直方图和直方图反向映射

histogram使用np进行直方图像素统计通过histogram对图像的三个通道分别进行一维直方图统计&#xff0c;由于被统计的数组必须是一维的&#xff0c;所以使用ravel将二维数组转换为一维数组&#xff0c;通过range参数指定统计区间为0--256&#xff0c;bin参数指定将统计区间分为2…

hamcrest_重新设计Hamcrest

hamcrest我在Hamcrest库上做了几篇文章 &#xff0c;我确实很喜欢使用它&#xff0c;但是我希望对其进行一些更改。 我了解他们所做的大多数设计决策&#xff0c;但我认为其中一些确实不值得。 介绍Litecrest 我对库所做的大多数更改都有助于减轻Hamcrest的负担&#xff0c;因…

程序员鄙视链python_关于程序员之间的鄙视链

鄙视像条食物链&#xff0c;是个绕不开的怪圈。在这个怪圈中&#xff0c;每一个人&#xff0c;都在链条的最末端。朋友圈有鄙视链&#xff0c;相亲有鄙视链&#xff0c;程序员圈也有鄙视链看完下面的鄙视链&#xff0c;你是那一层&#xff1f;↓↓↓↓【1】努力成为全栈&#x…

java自定义jsp标签_自定义JSP标签

1 写一个标签处理类//标签处理类public class IpTag implements SimpleTag {private PageContext pageContext;//Web容器调用NO1public void setJspContext(JspContext pc) {System.out.println("setJspContext()");pageContext (PageContext) pc;}//Web容器调用NO2…

新手学习C语言编程的8个致命错误,你中招了吗?

序言C语言的最大特点是&#xff1a;功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格&#xff0c;这就给编程人员留下“灵活的余地”。但由于这个灵活给程序的调试带来了许多不便&#xff0c;尤其对初学C语言的人来说&#xff0c;经常会出一些连自己都不…

java与java ee_Java EE拦截器

java与java ee历史 我认为重要的是要看一下Java EE中Interceptor的发展&#xff0c;因为它是从EJB特定的项目开始的&#xff0c;后来又演变成一个单独的规范&#xff0c;现在可供其他Java EE规范扩展&#xff0c;这一事实很简单。 版本1.0 拦截器最初是在EJB 3.0 &#xff08;…

python怎么查询元素是否在列表中_python怎么判断某一元素是否在列表中

定义一个列表&#xff0c;并判断元素是否在列表中。python学习网&#xff0c;大量的免费python基础教程&#xff0c;欢迎在线学习&#xff01;例如&#xff1a;test_list [ 1, 6, 3, 5, 3, 4 ]print("查看 4 是否在列表中 ( 使用循环 ) : ")for i in test_list:if(i…

python中带附件发送电子邮件_python发送带附件邮件

Python SMTP发送邮件SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。Python创建 SMTP 对象…

jpa 实体图查询_JPA实体图

jpa 实体图查询JPA 2.1的最新功能之一是可以使用实体图指定获取计划。 这很有用&#xff0c;因为它允许您自定义使用查询或查找操作检索的数据。 在使用中大型应用程序时&#xff0c;通常以不同的方式显示来自同一实体的数据。 在其他情况下&#xff0c;您只想选择最小的信息集…

C语言程序控制语句——while

while语句while &#xff08;表达式&#xff09; 语句当表达式为非0值&#xff08;真&#xff09;时&#xff0c;执行while循环体中的语句&#xff0c;如此往复&#xff0c;直到表达式的值等于0&#xff08;假&#xff09;&#xff0c;循环结束。如以下示例程序&#xff0c;循环…

kettle 资料_Kettle的使用-初级

本文从kettle的简介、下载、安装、初级使用来展开。1.kettle是什么&#xff1f;kettle是一款开源的ETL工具。可以运行在Windows和linux上。2.下载地址https://community.hitachivantara.com/s/article/downloads3.安装因为Kettle是基于Java开发的&#xff0c;所以要先安装jdk环…

python抢货程序_写个Python程序上下班抢个顺风单

#!/usr/bin/python# -*- coding: gb2312 -*-##########################################################################2015-12-11 09:47:46#author: 358275018qq.com#使用Python2.6/7######################################################################### 有些库没…

C语言 | 语句概述

C语言语句的作用和分类1、9种控制语句if&#xff08;&#xff09;...else.. //条件语句 for&#xff08;&#xff09;... //循环语句 while&#xff08;&#xff09;... //循环语句 do...while&#xff08;&#xff09; //循环语句 continue //结束本次循环语句 break //中止执…

react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

react性能优化方案在我以前的文章中&#xff0c;我研究了一个虚拟的交易引擎&#xff0c;并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾&#xff0c;我写道&#xff1a; 我怀疑随着Node.js的最近成功&#xff0c;越来越多的异步Java库将…

linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些

点击蓝字关注我哦以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-谈谈Linux日志查看方式都有哪些》▼ps&#xff1a;请在WiFi环境下打开&#xff0c;如果有钱任性请随意0.概述在我们面试各大公司的时候&#xff0c;关于Linux往往最容易问到的问题之一就是Linux指令…

vsm java_java – 我尝试使用JAXB将对象编组到xml文件中时,错误为“缺少@XmlRootElement注释”...

我是刚刚开始使用JAXB的人,所有我需要的是将对象写入xml并在某些时候将其读回java这是我的班级&#xff1a;public class VSM implements java.io.Externalizable{ArrayList termList; //Term DictionaryArrayList queryTermList; //Query listArrayList> docLists;ArrayLis…

jvm7 jvm8_自我修复的JVM

jvm7 jvm8这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案-“您是否尝试过将其关闭并重新打开”-可能适得其反&#xff0c;弊大于利。 我们不需要关闭电源&#xff0c;而是拥有可以自愈的应用程序&#xff1a;它在一开始就失败了&#xff0c…