C

C 知识量:16 - 74 - 317

10.3 指针简介><

什么是指针- 10.3.1 -

指针是一个值为内存地址的变量(或数据对象)。例如:

color = &red;

其中,color就是一个指针,而&就是地址运算符,用于表示变量的内存地址。以上语句可以称为color指向red。color与&red的区别是:color是变量,而&red是常量(即内存地址)。

间接运算符*- 10.3.2 -

如果color指向red,即:

color = &red;

可以使用间接运算符*找出存储在red中的值,该运算符有时也称为解引用运算符。间接运算符与二元乘法运算符使用的符号相同,但是语法功能不同。

var = *color;

将语句color=&red;和var=*color;放在一起相当于下面的语句:

var = red;

因此,使用地址和间接运算符可以间接完成上面这条语句的功能,这也是间接运算符名称的由来。

声明指针- 10.3.3 -

声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间,一些指针操作要求知道操作对象的大小。另外,程序必须知道存储在指定地址上的数据类型。以下是一些指针的声明示例:

int * pi;         //pi是指向int类型变量的指针
char * pc;        //pc是指向char类型变量的指针
float *pf,*pg;    //pf、pg都是指向float类型变量的指针

类型说明符表明了指针所指向对象的类型,星号(*)表明声明的变量是一个指针。

以上示例中,pc指向的值(*pc)是char类型,而pc本身的类型称为“指向char类型的指针”。pc的值是一个地址,在大部分系统内部,该地址由一个无符号整数表示。但是,不要把指针认为是整数类型。一些处理整数的操作不能用来处理指针,反之亦然。例如,可以把两个整数相乘,但是不能把两个指针相乘。

指针实际上是一个新类型,不是整数类型。ANSI C专门为指针提供了%p格式的转换说明。

使用指针进行通信- 10.3.4 -

可以利用指针在函数间进行通信。通常,值的传递可以分为值传递和引用传递,使用变量值进行传递的方式为值传递;使用变量地址进行传递的方式为引用传递。以下是一个示例:交换变量x和y的值:

#include <stdio.h>

void change(int*, int*); //函数原型

int main(void) {
    int x = 30;
    int y = 100;
    printf("First,x=%d and y=%d\n", x, y);
    change(&x, &y); //调用函数
    printf("In function main,after change,x=%d and y=%d\n", x, y);
    printf("Done.\n");
    system("pause");
    return 0;
}

//函数定义

void change(int* x, int* y) {
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
    printf("In function change,after change,x=%d and y=%d\n", *x, *y);
}

运行结果为:

First,x=30 and y=100
In function change,after change,x=100 and y=30
In function main,after change,x=100 and y=30
Done.

以上示例中,通过语句change(&x, &y);传递的不是x和y的值,而是它们的地址。使用指针和*运算符,函数change()可以访问存储在这些位置的值,并直接改变它们。这是引用传递与值传递最大的区别。

一般而言,如果只是计算或处理值,可以使用值传递;如果要在被调用函数中改变主调函数的变量,则应当使用引用传递,即利用指针进行通信。