1.间接访问运算符*和取地址运算符&
&:取地址运算符
*:间接访问运算符(也称“指针运算符”或“取内容运算符”)
例如:
&a为变量a的地址,*p为指针变量p所指向的变量。
在C语言程序中,间接访问运算符“*”出现的位置不同,含义也不同。
●出现在指针定义的语句中,这时表示定义的变量是一个指针变量。
●出现在程序的其他语句中,表示取指针变量所指向的变量的值。
取地址运算符&表示取出变量的地址。地址运算符&操作的对象只能是变量,不能是表达式。
运算符*和&的优先级相同,都是单目运算符、按自右向左方向结合。
例如:
表达式“&*p1”的含义是:先进行*p1运算,就是变量a,再进行&运算。因此“&*p1”与“&a”含义相同。
例6-1 间接访问运算符*和取地址运算符&应用示例。
程序运行的结果如图6-3所示。
图6-3 程序运行结果
从此例可以看出,与取地址运算符&对应的间接访问运算符*,表示对它后面的地址取内容。它作用于一个地址表达式上,取该地址表达式所指向的存储单元的内容。例如:
当间接运算符*作用于一个指针变量或地址表达式时,运算符*完全是根据该指针变量或地址的类型来决定如何对它所指向的存储单元进行访问的。具体地说,就是从该地址开始对几个字节的存储单元进行访问,按什么数据格式,解释这几个字节的存储单元中的二进制数据。
2.二级指针
可以让一个指针指向另一个指针,从而形成一个指针链。如图6-4所示。
图6-4 一个指针链
其中,指针pp包含的是指针变量p的地址,而p指向的地址存储了目标值。pp这样的指针也称为二级指针,它指向的是指针型的数据。
可以定义一个指针变量,它所指向的变量本身就是一个指针变量,这个指针就是一个指向指针的指针。这样定义的指针称为二级指针。定义的形式如下:
数据类型 **指针变量名;
其中“**指针变量名”相当于“*(*指针变量名)”,在括号中定义了一个指针变量,括号外的“*”说明指针变量(即二级指针)的目标是一个指针类型数据,“数据类型”是目标变量(即一级指针)所指向的数据类型,也就是最终目标变量的类型。例如:
该定义语句表明pp是指向int类型的指针。通过使用两次间接访问运算符“*”,用指向指针的指针来间接地访问目标值。
例如:
3.两个指针变量相减(www.xing528.com)
两个指针变量相减,用于表示两个地址间存放的数据对象的个数,而不是地址的绝对值的差。例如:
输出结果为5,表示两个地址间存放了5个整数数据。
参考程序:
程序运行一次的结果如图6-5所示。
图6-5 程序运行结果
该程序的输出还显示了每个字符的存储位置。不同的系统上输出的地址可能是不一样的,但它们的相互关系是一样的。
程序代码中当执行语句“ptr=name;”后,两个指针均指向同一个字符数组的首地址。当while循环结束时,指针ptr中保存的是结束符的地址。因此,语句“length=ptr-name;”就给出了字符串name的长度。
需要注意的是,两个指针相加,即两个地址值相加没有什么物理意义。
4.指针变量的自加自减运算
指针变量的自加自减运算,可以很方便地实现指针的偏移,通常用在循环中。
例如:
其中的for循环语句也可以改写成如下形式:
5.下标运算[ ]和取地址运算&
指针的间接引用运算和下标运算功能是相同的。例如:
下标运算[ ]与取地址运算&,又是互逆的。例如:
&p[0]、p、&*p也是等价的。
正是因为指针语法的灵活性,给初学者带来很多困难,但掌握后,使用起来也会十分方便。
6.两个指针变量的关系运算
(1)指向同一数组的两个指针变量进行比较。
指向同一数组的两个指针变量进行关系运算,可以表示它们所指数组元素之间的关系。
例如:
通常两个或多个指针指向同一数组(如一串连续的存储单元)元素时,比较才有意义。
(2)指针变量与0进行比较。
设p为指针变量,则p==0表示p为空指针,它不指向任何变量;p!=0表示p不是空指针。空指针是由对指针变量赋予0值而得到的。
例如:
对指针变量赋0值与未赋值是不同的。指针变量未赋值时,称为野指针。它可以是任意值,是不能使用的,否则会造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。