龙空技术网

「C语言初级」.初识指针

计算机科学技术 410

前言:

此刻姐妹们对“c语言指针教学”大体比较关注,看官们都想要分析一些“c语言指针教学”的相关内容。那么小编在网络上收集了一些有关“c语言指针教学””的相关知识,希望看官们能喜欢,朋友们一起来了解一下吧!

指针为C语言中一种数据类型,它是一种用以存放内存地址的特殊数据类型,指针类型和普通的int、double类型不同,它不是一个基础类型,而是与C语言提供的基础类型而形成的复合类型。比如基础类型有int、double、char,它们所对应的指针类型分别为int型指针、double型指针和char型指针,这些指针都有一个通用的性质,都是指向基础类型变量的地址,即int型指针执行int类型变量的地址,double型指针指向double类型变量的地址,char型指针指向char类型变量的地址。对于基础的变量,我们可以书写如下代码:

图1

相应地,可以定义这些类型的指针变量,如下:

图2

这些指针类型变量在基础类型之后使用了星号,这就表明所定义的类型为一指针类型。关于星号的位置问题,有人喜欢将星号靠近基础类型书写,比如上面的代码中使用了这种写法,也有人喜欢将星号靠近变量名称书写,下面代码为对应的另一种书写风格:

图3

两种类型的书写方式没有本质上的区别,代码中保持书写一致即可。

指针类型与普通类型的变量一样,也是支持进行初始化和赋值操作。以基础类型int型为例,初始化一个变量为0的语句为:

图4

但是,指针对应的“零值”是什么?在C语言中,指针的“零值”使用特殊常量NULL表示,那么其对应的初始化为“零值”的语句就可以这样书写:

图5

对于变量的初始化,其值不一定都是“零值”,还有可能是普通的数值,比如,整型的100,浮点型的3.14等,一个整型指针也可以初始化为一个内存地址,这个内存地址准确地说应该是一个整型变量所在的内存地址。比如上述图4代码中a的地址,如何获取变量所对应的内存地址呢?使用一个名称为获取地址的运算符&,它是一个一元操作符,其用法是将它放置在变量名称之前,如&a,获取变量a所对应的内存地址,使用下面的代码,初始化pa指针为变量a的地址。

图6

指针在初始化为合法的内存地址之前是非法的,其内容不可以直接访问,只有将指针的地址设置为一个合法的变量地址之后,便可以通过这个指针操作数据。根据指针的特殊性,它本身就是一个内存地址,我们可以通过printf函数并指定对应的转换符%p来显示这个内存地址,显然,对于指针来说,只显示指针所指向的内存地址并不能显示出指针的作用,与这个地址上所对应的数据相比,这个数据显得比地址本身更为重要,因此,每一个基础类型的指针都提供了通过反引用(dereference)访问对应数值的功能,比如,上述pa指针若要访问它指向的变量a中的数据,可以使用*pa的方式,如下图代码,分别显示指针pa的值和指针pa指向的值。

图7

指针类型的变量除了支持反引用操作符之外,还支持几个常见的操作符:加号操作符(+),减号操作符(-),递增操作符(++),递减操作符(--),加赋值操作符(+=),减赋值操作符(-=)和sizeof操作符。这些操作符对于普通的单个变量地址操作没有实际意义(甚至使用反引用访问非法地址会导致程序异常),只有在特定的环境下才可以使用,比如,访问数组时,将指针指向第一个元素所对应的地址,之后就可以通过不同的偏移量实现访问数组中不同位置的元素。

图8

图8中第21行代码定义了一个4个元素的整型数组,第22行代码将整型指针pAges指向了数组第一个元素的地址(这个元素的地址其实与数组ages的地址是同一个内存地址),第24行代码通过反引用显示了数组中的第一个元素(索引为0)的数值,之后第25行代码对指针pAges执行了递增操作,即pAges现在指向了数值中第2个元素,其数值为36;第27行代码对指针pAges执行了加赋值操作,将指针向后移动了2个元素,指向了最后一个元素72。由于数组中的数据存放方式是连续的、线性的,当指针的类型确定之后,那么对指针进行算术运算后,如果指针依旧在数组的合法范围内,就可以得到一个新的指针及其对应的数值。

字符指针广泛引用于字符串操作。通常在操作字符串时,首先会将指针指向这个字符串的首地址,之后依次通过移动指针,直至遇到字符串的终止操作符’\0’,这样就访问了字符串中的每一个字符,也称为遍历字符串。下面的例子使用这种方法实现将一个字符串的内容复制到另一个数组中,构成另一个字符串。

图9

图9中src字符串为源字符串,代码第33-39行代码将源字符串中的内容复制到数组dst中,并构成一个新的字符串。第33行代码将字符指针指向源字符串首地址,第44行代码将字符指针pDst指向数组dst首地址,之后使用一个while循环语句,在循环语句第35行代码,判断当前的pSrc指针所指向的字符是否为’\0’字符,如果结果为真的话,则终止整个循环语句,复制操作完成,否则一直执行代码第36-38行,第36行代码将pSrc指针指向的字符赋值给pDst指针所指向位置的字符,第37行代码递增pSrc字符指针,第38行代码递增pDst字符指针,即每执行一次赋值操作,源字符指针和目标字符指针都向后移动一个位置,直至源字符指针指向的字符值变为’\0’位置。

标签: #c语言指针教学