指针,又见指针
一、指针简介
一般来说,指针是一个其数值为地址的变量(或更一般地说是一个数据对象)。正如char类型的变量用字符作为其数值,而int类型变量的数值是整数,指针变量的数值表示的是地址。
如果你将某个指针变量命名为ptr,就可以使用如下语句:
ptr=&pooh; //把pooh的地址赋给ptr
对于这个语句,我们称ptr指向pooh。ptr和&pooh的区别在于前者是变量,后者是常量。ptr可以指向任何地方:
ptr=&bath; //令ptr指向bath
二、间接运算符
假定ptr指向bath:ptr=&bath
这时就可以使用间接运算符*(也称取值运算符)来获取bath中存放的数值。
val=*ptr; //得到ptr指向的值
语句ptr=&bath;以及语句val=*ptr;放在一起等同于下面的语句:
val=bath;
下面进行举例:
nurse=22;
ptr=&nurse; //指向nurse的指针
val=*ptr; //将ptr指向的值赋给val
上述语句实现的功能是把数值22赋给变量val
三、指针声明
例如:long和float两种类型的数值可能使用相同大小的存储空间,但是他们的数据存储方式完全不同,指针的声明形式如下:
int *pi; //pi是指向一个整数变量的指针
char *pc; //pc是指向一个字符变量的指针
float *pf,*pg; //pf和pg是指向浮点变量的指针
类型标识符表明了被指向变量的类型,而表示该变量是一个指针。声明int * pi;的意思是pi是一个指针,而且pi是int类型的。
*和指针名之间地空格是可选的。通常程序员在声明中用空格,而在指向变量时将其省略。
pc所指向的值(*pc)是char类型的。而pc本身是什么类型的?
我们将其描述为“指向char的指针”类型。pc的值是一个地址,在大多数系统中,它是由一个无符号整数表示。但是这并不表示可以把指针当做整数类型。一些处理整数的方法不能用来处理指针,反之亦然。例如,可以进行两整数相乘,而指针不能。因此指针的确是一种新的数据类型,而不是整数类型。
四、使用指针在函数间通信
在下面的程序中,函数interchange()只用了指针参数,我们将对该函数进行详细的讨论。
#include<stdio.h>
void interchange(int * u, int * v);
int main(void)
{
int x = 5, y = 10;
printf("Originally x=%d and y= %d.\n", x, y);
interchange(&x, &y); //向函数传送地址
printf("Now x= %d and y=%d.\n", x, y);
return 0;
}
void interchange(int * u, int * v)
{
int temp;
temp = *u;//temp得到u指向的值。
*u = *v;
*v = temp;
}
下面我们分析以上程序的运行情况。首先,函数调用语句如下:
interchange(&x, &y); //向函数传送地址
可以看出,函数传递的是x和y的地址而不是他们的值。这就意味着intechange()函数原型声明和定义中的形式参数u和v将使用地址作为它们的值。因此他们应该声明为指针,由于x和y都是整数,所以u和v是指向整数的指针。其声明如下:
void interchange(int * u, int * v);
接下来,函数体进行如下声明:
int temp;
从而提供了所需要的临时变量。为了把x的值存在temp中,需要使用下面语句:
temp = *u;//temp得到u指向的值。
注意,因为u的值是&x,所以u指向x的地址,这就以意味着*u代表了x的值,而这正是我们需要的数值。
在示例程序中,我们用一个函数实现x和y的数值交换。首先函数使用x和y的地址作为参数,这使得它可以访问x和y变量。通过使用指针和运算符*,函数可以获得相应存储地址的数据,从而就可以改变这些数据。
在ANSI原型中可以省略变量名称。这样,函数原型可以按如下形式进行声明:
void interchange (int * ,int *);
通常情况下,可以把关于变量的两类信息传递给一个函数,如果函数的调用形式为:
function1(x);
这时传递的是x的值,但是如果使用下面这种函数调用形式:
function2(&x);
那么会把x的地址传递给函数。第一种调用形式要求函数定义部分必须包含一个和x具有相同数据类型的形式参数。如下所示:
int function1(int num);
而第二种形式要求函数定义部分的形式参数必须是指向相应数据类型的指针:
int function2(int *ptr);
使用函数进行数据计算等操作时,可以使用第一种调用形式。但是如果需要改变调用函数中的多个变量的值时,就需要使用第二种调用形式。
尽管interchange()只使用局部变量,但是通过使用指针,该函数可以操作main()中的变量的值。