6.2.1 指针变量的定义
在 C 语言中,指针变量的定义格式为:
数据类型 *变量名;
乍一看,是不是和普通变量的定义格式很像?唯一不同的是,在变量名之前多了一个星号“*”。需要注意的是,这里的星号只是一个标记符,用于区别普通变量,并不是解引用运算符。也就是说,在变量定义时,变量名之前如果有星号,那么定义出来的就不再是普通变量,而是一个指针变量。
定义最前面的“数据类型”表示该指针变量的类型。我们知道,指针变量用于保存内存地址,那为什么还要有数据类型呢?难道内存地址还分各种类型吗?这是刚开始接触指针变量时,最令人难以理解的。
大家可以想象一下,如图 6.6 所示如果没有数据类型,只有一个内存地址,该如何去正确地访问和使用内存数据呢?
图 6.6 指针示意图
图中,指针变量保存的值为 4,通过指针(虚线箭头部分)可以访问到地址为 4 的内存区域,我们知道内存中保存的都是些二进制码,并没有关于数据类型的信息。如果不知道数据类型,那么应该访问多少字节的二进制数据,又该如何去解读这些二进制数据呢?
要想回答这个问题,就先来看看,在有数据类型的情况下是如何处理的。
如果指针变量是 char 类型的,那么就只需处理地址为 4 的 1 字节,并且知道该字节,即 8 位的二进制码对应的是字符的 ASCII 码。
如果指针变量是 short 类型的,那么需要处理从地址为 4 开始的 2 字节(即地址 4 和地址 5),并且知道这 2 字节,即 16 位的二进制码对应的是一个 short 类型的值。
如果指针变量是 float 类型的,那么需要处理从地址为 4 开始的 4 字节(即从地址 4 到地址 7),并且知道这 4 字节,即 32 位的二进制码对应的是一个 float 类型的值。
现在应该知道指针变量为何要指定数据类型了吧?是的,只有让指针变量具有明确的数据类型,才能通过指针正确地去访问和解读这些内存数据。换句话说,就是知道了指针变量的类型,也就知道了指针所指向的对象,即该对象拥有什么类型的数据。
下面定义两个指针变量:
一般将指针变量的名字以字母“p”开头,这是因为“p”是指针的英文单词“pointer”的首字母,所以,看到这样的变量名,就知道这是一个指针变量。
可以将同类型的指针变量与普通变量,甚至数组,放在一起进行定义。例如:
int *pi, a; //定义 int 类型的指针变量 pi 和 int 类型的变量 a
这里要注意的是,星号只对 pi 起作用,即只表示 pi 是指针变量,而 a 的前面并没有星号,因此,它只是普通的 int 类型变量。如果要将 a 也定义为指针变量,则需这样:
int *pi, *a; //定义了两个 int 类型的指针变量,变量名分别是 pi 和 a
也就是在定义时,每个指针变量名的前面都需要加上星号,例如:
int a, *pi, arr[10]; //定义了 int 类型的变量 a、指针变量 pi 和长度为 10 的数组 arr
定义指针变量后,不要直接去使用,不然可能会出大问题,因为还没有对它进行初始化或赋值,也就是还没有让指针指向一个正确的对象。和普通变量一样,如果指针变量被定义为一个局部的且非静态的,那么编译器不会对其进行默认初始化,其值是未确定的。如果我们将这个未确定的值当作一个内存地址来进行数据的访问和修改,可能会出问题。
所以在使用指针变量前,必须对其进行初始化或赋值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论