浅谈C语言的指针
摘要:指针是c语言区别于其他高级语言最重要的特性,是c语言的生命力。结合指针的概念,指针定义,指针的类型以及指针运用等方面来认识和掌握使用指针的方法和技巧,循序渐进从而熟练灵活地使用指针使程序更加便捷,紧凑,高效。
关键词:c语言 指针 内存地址 指向 数组
1 前言
c语言是一种通用性计算机程序设计语言,它兼有汇编语言和高级语言的双重优点[1],运用它既能编写操作系统软件,又能开发各个领域的应用软件。对于操作系统和系统实用程序以及需要对硬件进行操作的场合用c语言明显优于其他解释型语言[2]。在计算机或一些单片机中,都是通过地址才能对数据进行操作,指针让程序更高效,更简洁也正是丰富的指针运算功能才使得c语言是目前最常用最流行的面向过程的结构化程序设计语言。c语言指针的功能强大,使用灵活多变,可以有效地表示复杂的数据结构、动态分配内存、高效地使用数组和字符串、使得调用函数时得到多个返回值,直接处理内存单元地址[1]。因此,指针是c语言的灵魂,抓住指针的基本特点和应用要点,从而轻松高效地编写出优秀的c程序代码。
2 指针的基本概念字符串常量实质上是一个指向该字符串首字符的指针常量吗
指针简单而言就是内存单元的地址,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。指针变量是一种特殊变量,系统为指针变量分配一块连续存储单元不是供其存储数据,而是存储内存地址,因此指针变量是存储内存地址的变量。要理解指针的概念必须先弄清楚内存是如何存储数据使用时又是如何读取数据的。一个字节就是一个内存单元,整个内存单元是一维的,每个字节都有唯一的序号,称为内存单元的地址,操作系统要占用一些计算机的内存空间,每个应用程序也要占用计算机的内存空间。按照面向过程的程序设计方法,程序代码和程序要处理的数据是分开存储的。任何计算机程序要放在内存中才能执行,一个程序在内存中占两部分存储空间:数据部分和程序代码部分[2]。在编译时系统会为每一个定义的变量分配相应的内存单元地址,经过编译以后已经将变量名转化为变量对应的地址,对变量值的存取都是通过地址进行的。这种变量地址存取变量的方式称为“直接访问”方式,还可以采用称之为“间接访问”的方式,所谓间接访问,是先访问存放变量地址的存储单元,得到该变量的地址,再对变量内容进行访问。在c语言中把这种用来存放变量地址的变量就叫作指针变量。
3 指针变量的定义和初始化
指针是c语言的一种数据类型,它和c中的整型,字符型一样可以用来定义指定类型的变量。所有能定义变量或对象的类型都可以定义为指针。指针变量的定义格式为:基类型 *变量名;
指针变量前面的”*”指明该变量的类型为指针变量,指针变量名为”*”后面部分,这与定义整型和浮点类型变量的形式不同。在定义变量时必须指定其基本类型。在此有人不明白既然指针存放的是地址常量,地址都是int型数据为什么还要强调指针的类型?在c语言中若指针变量p已经指向数组中的一个元素,则p+1指向同一数组中的下一个元素,而不是将p的值(地址)简单加1。例如,数组元素是float型,每个元素占4个字节,则p+1意味着使p的值(地址)加4个字节,以使它指向下一个元素,p+1所代表的地址实际上是p+1*d,d是一个数组元素所占的字节数。这样用指针变量直接指向元素,不必每次都重新计算地址,像p++这样的自加操作是比较快的。这种有规律的地改变地址(p++)能大大提高执行效率。在进行指针运算的过程中用p++使p的值不断改变从而指向不同的元素,这是合法的,但是不用p而使数组名a(a为数组名)变化(例如用a++)这样是不行的。因为此时a代表首元素的地址,它是一个指针常量,它的值在运行期间是固定不变的。
在定义指针变量时,指针变量的值是随机的,不能确定它的具体指向,它是个野指针如果引
用了这个指针,并修改指针所指向的内容,而如果这个指针所指向的内容恰好是另外一个程序的数据的话,你将其进行修改了,就会导致另外一个程序可能不能正常运行了.所以使用前一定要进行初始化,只有指向具体的地址的指针才是有效。如果程序一长,就很容易造成指针悬空,或者两个指针指向同一地址,如果这个时候对它们操作就会造成很多错误。指针在初始化时一般有两种类型:
上面void类型指针是指向任何类型数据的指针,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。某些情况下,不知道指针的类型,先用void *来代替,根据需要再强制转换成需要的指针类型使用。比如malloc函数,它只是申请了一块堆内存,并将首地址返回,但是它根本就不知道调用者会用什么指针来接收这个地址,所以干脆就返回一个指向内存地址的空指针,由用户自己来转换,void 指针是唯一可以指向void类型函数的函数指针。null指针作为特殊的指针变量表示不指向任何实际对象和函数。在malloc函数开辟内存空间失败后就返回null,null指向的就是值内存中0的地址。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。