c语言指针概述,C语言指针概述.doc
首先,我们来看一看指针有什么用?
讲道理的话,如果你到目前没有发现指针有什么用,那就不用,挺好的。
你看C++程序员做个软件也基本不会把C++的语言特性都用上是吧。你有数组,有结构体,有函数,什么事情做不成呢?
是吧。直到有一天,你遇见了这样一个问题:试编写一个函数swap(x, y)使得其能够交换x和y两个变量的值这个……
很简单嘛。我开始写:
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
然后你调用一下,发现……咦,怎么没用。
啊啊啊啊啊!好难过好难过,怎么回事?
你上网求助,发现大神们告诉你要用指针写,像这样:
void swap(int * x, int * y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
然后调用的时候swap(&a, &b);就行了。
哇啊啊啊好神奇!
于是,指针的第一个用处出来了:它能使得函数有能力交换两个变量的值。
怎么做到的呢?我们来看看。
我相信你已经知道了,每一个变量都有属于自己的一块空间,那这块空间在哪里呢?
答案是:内存,哦不!准确一点说是虚拟内存 (Virtual Memory) 里。
那计算机怎么知道我要找的是变量b的空间而不是a的空间呢?
是因为每一个变量所属的空间都有一个惟一的地址,计算机只要通过这个“地址”,就可以找到里面的值了。
这种根据一个地址就能直接访问到一块内存空间的方式,我们叫做随机读取。
具体它是如何做到的,可以去看看Charles Petzold的《编码》一书,里面甚至从最基本的电路一步一步讲起,构造一台最基本的计算设备。
还有一个问题是,如果我的变量占有多个空间(字节),但是一个地址只能对应一个空间,那我们又有两个问题:如果我们要用一个地址代表整个变量所占的内存空间(假设4个字节),我这四个空间是从前向后排还是从后向前排?比方说我变量的值是AE 01 08 82,那我在内存里从前向后的排序到底是82 08 01 AE还是AE 01 08 82?我怎么知道我叫这个名字的变量占几个空间?第一个问题显然又是信仰之争。所谓从前向后的,我们叫做大端序 (big-endian);另一种,我们叫做小端序 (little-endian),大端序与小端序的转换在网络传输的时候会用到,Intel的CPU大多采用的都是小端序。
而第二个问题,由于C里每个变量都有自己的类型,所以编译器会根据不同类型的各自尺寸生成相应的代码。说这么多干什么呢?
只是为了让你更好地明白,你在程序里定义的变量乃至函数代码,全都是存储在随机存储器(内存)里的。
每个变量都有自己的起始地址,即属于自己的一块位置。那指针是什么呢?指针当然也是变量咯,指针也跟其他类型的变量一样,有自己的一块空间,空间里的二进制位构成了一个值。
这个值可以是任意的,你甚至可以把它当作整数来用。(没记错的话,指针的本质类型应该是unsigned long。即无符号的长整形数据)
而指针跟其它变量类型的根本性不同在于,它有一个取值的运算符,即*符号。
因为它可以取值,所以指针类型的变量就不仅可以有自己的值,也可以“操纵”其它变量的值了。
无论是多么复杂的指针,本质上它们的存在都跟这个*操作有关。回到我们开始说的那个swap函数。
为什么第一种写法无法达成交换两个变量值的效果?
原因跟指针无关,跟函数参数的传递方式相关。原因可以用一句话来解释:你的swap函数里出现的x和y,跟你传参数进去时候的a和b,根本没有指向同样的内存地址。
当函数调用的时候,a和b被复制了一份给了x和y变量。
你在swap函数里对x和y进行的所有操作,都是对这两块新的内存地址里的值进行操作,影响不到a和b的内容。你不是没有交换东西,只是被交换了的x和y在swap函数调用结束之后空间就被回收了而已。(回收的概念如果不懂得会可以理解为销毁)
这种“把传进去的参数复制一份”的方式叫做值传递。
而在其他一些语言比如C++或者Visual Basic里面,还存在一种传参数的方式叫引用传递,即函数里面的参数和传进去的参数,指向同样的内存地址。(引用的传递是在C++;里面有的,纯C语言没有)
在纯C里面,我们不存在引用传递,因此要模拟引用传递的效果,只能用指针来实现。
第二个函数调用的方法有点不太一样,是swap(&a, &b),比起上一个版本多了&符号。这个符号的意思是“取地址”,函数的形式参数是两个指针,在调用的时候本质上也是值传递,只不过这次复制的不是a和b的值,而是a和b的地址。
在函数内部,我的x和y两个指针也是两块独立的空间,有各自的内存地址。
只是它们的值对应了a和b两个变量的地址,所以我用*操作,就可以完成“操控
总结
以上是生活随笔为你收集整理的c语言指针概述,C语言指针概述.doc的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 印度语中的lata是什么?
- 下一篇: c语言程序的多文件组织,C代码多文件的组