欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

c语言指针概述,C语言指针概述.doc

发布时间:2025/4/5 编程问答 31 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。