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

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/338992.shtml

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

相关文章

mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

在一开始接触MySQL数据库时&#xff0c;对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M&#xff1b;后来工作后&#xff0c;也是一边学习一边使用&#xff0c;之后的理解是其中的M的意思是插入数据库中的值的字符长度不能大于M&#xff…

api怎么写_使用Node.js原生API写一个web服务器

Node.js是JavaScript基础上发展起来的语言&#xff0c;所以前端开发者应该天生就会一点。一般我们会用它来做CLI工具或者Web服务器&#xff0c;做Web服务器也有很多成熟的框架&#xff0c;比如Express和Koa。但是Express和Koa都是对Node.js原生API的封装&#xff0c;所以其实不…

C语言预处理命令分类和工作原理

C语言编程过程中&#xff0c;经常会用到如 #include、#define 等指令&#xff0c;这些标识开头的指令被称为预处理指令&#xff0c;预处理指令由预处理程序&#xff08;预处理器&#xff09;操作。相比其他编程语言&#xff0c;C/C 语言更依赖预处理器&#xff0c;故在阅读或开…

查看mysql用户权限_mysql 如何查看该数据库用户具有哪些权限?

展开全部背景在了解动态权限之前&#xff0c;我们先回顾下 MySQL 的权限列表。权限列表大体分为服务级别和表级别&#xff0c;列级别以32313133353236313431303231363533e59b9ee7ad9431333433633464及大而广的角色(也是MySQL 8.0 新增)存储程序等权限。我们看到有一个特殊的 SU…

注释嵌套注释_注释,无处不在的注释

注释嵌套注释十年前的2004年 &#xff0c; Java 1.5开始提供注释。 很难想象没有此功能的代码。 实际上&#xff0c;首先引入了注释&#xff0c;以减轻开发人员编写繁琐的样板代码的痛苦&#xff0c;并使代码更具可读性。 考虑一下J2EE 1.4&#xff08;没有可用的注释&#xff…

a标签跳到另一个页面指定选项卡_HTML常用标签

本篇文章主要是对a、img和table标签用法介绍&#xff1a;a标签&#xff1a;可称为锚元素&#xff0c;主要功能是创建通向其他网页、文件、同一页面的其他位置、电子邮件地址或其他任何url地址的超链接&#xff1b;1.img标签&#xff1a;发出get请求并显示返回的图片1.常用属性&…

c语言也能用模板方法模式?

模式动机在嵌入式的应用场景中&#xff0c;管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后&#xff0c;还必须释放资源。例如fopen()打开文件后&#xff0c;必须要使用fclose()来关闭文件&#xff0c;而使用malloc申请内存资源后&#xff0c;就…

游戏 服务器 微服务_整体服务器与微服务

游戏 服务器 微服务介绍 刚开始时&#xff0c;由于要求简单&#xff0c;所以应用程序既简单又小。 随着时间的要求和需求的增长&#xff0c;我们的应用程序变得越来越大&#xff0c;越来越复杂。 这就导致了将单片服务器开发和部署为一个单元。 在某种程度上&#xff0c;微服务…

数据与ELF数据节-计算机系统基础题目

实验内容&#xff1a;修改二进制可重定位目标文件“phase1.o”的数据&#xff08;.data&#xff09;节内容&#xff08;不允许修改其他节&#xff09;&#xff0c;使其与main.o模块如下链接后运行时输出目标字符串“123456789”。 实验步骤&#xff1a; 1. 使用objdump工具获得…

sqlserver拼接sql插入table_10个SQL技巧

介 绍为了理解这 10 个 SQL 技巧的价值&#xff0c;首先需要了解下 SQL 语言的上下文。为什么我要在 Java 会议上讨论 SQL 呢&#xff1f;(我可能是唯一一个在 Java 会议上讨论 SQL 的了)下面讲下为什么&#xff1a;从早期开始&#xff0c;编程语言设计者就有这种的愿望&#x…

【C语言笔记】指定初始化器

C99增加了一个新特性&#xff1a;指定初始化器(designated initializer)。利用该特性可以初始化指定的数组元素&#xff0c;也可以初始化指定的结构体变量。本文主要分享&#xff1a;使用指定初始化器初始化数组。例如&#xff0c;只初始化数组中的最后一个元素。对于传统的C初…

java锁性能对比_提高Java的锁性能

java锁性能对比Plumbr是唯一可以通过解释应用程序性能数据来自动检测Java性能问题根本原因的解决方案。 几个月前&#xff0c;我们在Plumbr中引入了锁定线程检测之后&#xff0c;我们开始收到类似于“嘿&#xff0c;太好了&#xff0c;现在我知道是什么导致了性能问题&#xf…

binlog日志_MySQL三大日志binlog、redo log和undo log

点击蓝色“JavaKeeper”关注我哟加个“星标”&#xff0c;一起成长&#xff0c;做牛逼闪闪的技术人Keeper导读&#xff1a;日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制…

C 语言精髓之变参函数

我们以 printf 这个 very 熟悉的函数为例&#xff0c;来分析一下变参函数。先看下 printf 函数的定义&#xff1a;int printf(const char *fmt, ...){ int i; int len; /* va_list 即 char * */va_list args;va_start(args, fmt); /* 内部使用了 va_arg() */len v…

lambda捕获this_非捕获Lambda的实例

lambda捕获this大约一个月前&#xff0c;我在Java 8的lambda表达式框架下总结了Brian Goetz的观点 。 目前&#xff0c;我正在研究有关默认方法的文章&#xff0c;令我惊讶的是&#xff0c;我又回到了Java处理lambda表达式的方式。 这两个功能的交集可能会产生微妙但令人惊讶的…

mysql8 安装_MySQL8.x安装使用

1.下载网址https://dev.mysql.com/downloads/mysql/下载要登录&#xff0c;可以使用Oracle账户登录2.安装MySQL服务下载好的解压到D:developer目录下配置MySQL(windows下是my.ini&#xff0c;Linux下是my.cnf)[mysql]# 设置mysql客户端默认字符集default-character-setutf8[mys…

从原理到方法,一文讲清如何应对C语言内存泄露!

可能不少开发者都遇到过内存泄漏导致的网上问题&#xff0c;具体表现为单板在现网运行数月以后&#xff0c;因为内存耗尽而导致单板复位现象。一方面&#xff0c;内存泄漏问题属于比较浅显的错误&#xff0c;此类问题遗漏到现网&#xff0c;影响不好&#xff1b;另一方面&#…

openshift_OpenShift上具有NetBeans的Java EE

openshift今天是慕尼黑的NetBeans日 。 我很高兴提出一个关于将Red Hat产品与我著名的IDE集成的会议。 因此&#xff0c;我一直在谈论WildFly &#xff0c; EAP &#xff0c;Git和OpenShift Online&#xff0c;并展示了使用该工具集优化开发工作流程的所有不同方式。 大约有10…

const char * 类型的实参与 char * 类型的形参不兼容_4 种 C++ 强制类型转换,你都清楚吗?...

我们先来回忆以下&#xff0c;C 语言的强制类型转换形式&#xff1a;(type) expr;这种旧式强制类型转换从表现形式上来说不够清晰明了&#xff0c;容易看漏&#xff0c;一旦转换过程出现问题&#xff0c;追踪起来也就更加困难。为了解决以上问题&#xff0c;C不仅兼容了C的强制…

ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇

"pythonic生物人"的第106篇分享本文详细介绍ggplot2中图例标度(legends scales)&#xff0c;续前篇R可视化07|ggplot2图层-标度图层(scale layer)-颜色盘篇本文目录4、图例标度(legends scale)图例位置设置修改ggplot2的图例符号ggplot2的图例顺序|方向等花里胡哨设置…