吹着牛B学C语言---指针(中)

吹着牛B学C语言---指针(中)

本文中的代码全部在VC2008下调试通过

打算分三个部分把指针这部分知识讲完,首先我们看一个例子,看看上一篇的东东是否掌握。 写一个函数,传递参数ab,在函数中将这两个值交换,再在主函数中输出交换后的值。

想一下,是要按值传递还是要按地址传递呢?我们需要在函数中对这两个值进行交换,如果是按值操作的话,传入函数的仅仅是它们的“副本”,如果交换的话也是“副本”进行交换,所以不行。请看如下代码:

 

这就是交换两个值的函数。程序运行的结果是2 1 。交换了。

 

OK,下边我们说一下实际应用中常见的一个小错误:空指针的操作。

一般,习惯上,我们需要在定义一个指针的时候赋初值,比如int *a=NULL; 不赋初值的指针是非常危险的,NULLWinDef.h头文件里边定义为 #define NULL 0  ,因此,这里相当于让a指针指向了地址为0的地方,基本上所有的操作系统中,0个字节的内存都是处于存放系统内核的区域内的,是不能让用户直接访问和读写的,所以,使用一个值为NULL的指针(即它指向第0字节的内存)会产生如:"XXX所引用的内存地址0X0000不能为READ"之类的错误.这个错误是操作系统的保护机制在起作用.。基于这点,我们如果在以后访问该指针的时候会报错,但是如果我们并没有将指针进行初始化,不同的编译器对这个会有不同的处理,有些会在运行的时候提示错误(比如说较高版本的VSVS2008等),有些就不会(比如C-FREE),这就依赖于编译器的实现。

这个程序,在VS中运行时会出现错误,提示a没有被初始化,在C-FREE中会出现一个随机值。

这个程序运行的时候都是输出都是0

要命的在后边:

我们输出并不会对系统造成什么影响,但是如果把printf换成scanf就不同了。这里边涉及到了操作系统对内存的一些管理机制,也就不展开说明了。总之,大家记住,指针一定要初始化!

 

接下来说说mallocfree,这两个函数被大家看起来是比较“高阶”的函数,确实,这两个函数使用不当会造成很严重的后果,但是高阶的函数也有低阶的用法,只要我们足够认真,这些错误是可以避免的。

一定要注意,mallocfree要配对使用,可能现在我们写小的控制台程序不会很明显,但是当我们真正参加工程的开发的时候,因为很多程序都是要长时间运行的,因此一定要注意内存泄露的问题。

malloc返回的是指向分配的内存的指针,先来个例子吧。

看看这段程序写的是什么?其中有很多细节,我们可以先不做追究,首先定义了一个指针,然后再给它分配sizeof(int)*9的内存,sizeof(int)返回的是int的大小,在x86的计算机里边VC6定义的int大小为4。因此这个指针指向的就是已经分配好的4*9==36字节的内存,当然,千万不要试着存入大于36个字节的东西,否则,后果自负。呵呵。

先说到这里,今天先睡觉。呵呵。

 

感谢小锐朋友提出的错误!

最后,当我们存入大于36个字节的信息的时候,效果和数组越界一样,会发生危险。

另外,关于scanf写入未初始化指针的内容,涉及到操作系统的保护机制,太复杂了,在这里仅仅了解就 OK,或者连了解都不用。。。

今天的内容,作为初学者,我们只需掌握以下几点:第一,声明指针的同时一定要对其初始化(这不是C标准规定的,但确实是一个非常好的习惯)。第二:如何使用mallocfree,以及它们的注意事项。第三:函数值传递和地址传递的区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值