Android技术知识Android开发

解惑——用指针交换两个数字时所犯的错误

2018-10-20  本文已影响0人  Android高级架构探索

以前经常刚开始写c的时候经常犯错,想想也很有意思,最近正好趁着这个时光做了一下总结。c中指针的使用时非常重要的,但是无论是什么语言,都要首先树立内存空间这一概念,这样的话会很容易找到不同语言之间的相似点。首先我们要明白,一个内存单元的地址就叫做指针。那什么是内存单元呢?一般来说我们把存储器中的一个字节成为一个内存单元,不同数据所占的内存单元数不等,比如说char占用一个内存单元。为了让计算机能够找到某个内存单元,必须为每个内存单元进行编号,这里的编号就是我们所说的地址,也就是c中提到的指针。现在我们明白,内存单元其实由内存单元地址和内存单元内容共同构成。举个例子来说明这种关系,一个房屋有自己的地址(比如说天使街111号)是指针,而房屋里人就相当于内存单元的内容。当我们寻找某个人时,我们先找到他的房子即可。在c语言中允许使用一个变量来存放指针,这种变量成为指针变量。要注意的是,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。除此<之外不要忘记,指针实际上也是一个地址。在c中,我们可能遇到交换个数值得情况。这里也许会遇到一些问题。见代码:


image.png

运行结果:

the a is 5
the b is 8
the a is 8
the b is 5


the a is 8
the b is 5
the a is 8
the b is 5
请按任意键继续. . .
我们发现swap1不能正确实现交换两个数。可能一开始是这么考虑的,要交换两个数,我交换一下a和b的地址不就行了么?可在采用这种函数调用的方式中不能这么写。首先我们在分析一下在main中调用swap1这个过程,如图所示:

image.png

在swap1区域内,确实发生了交换。但是需要注意到swap1过程发生在栈当中,也就是局部作用域,此时交换地址相当于把地址当做普通的变量进行交换,一但局部作用域结束,此时在main作用域内,变量a的地址仍然是ox887799,b的地址0x888800.所以没有发生交换。在java当中,这就相当于一个方法接收一作整形变量作为形参,在该方法内对该形参所做的修改不会影响到实参值。

总结一下,如果要实现在函数内修改外部变量,最好的方式修改单元内容。

另外要注意在使用指针常犯的两个错误:

1、不给指针赋值,直接调用

2、指针类型和地址的类型不匹配

float t

int* i=&t

上一篇 下一篇

猜你喜欢

热点阅读