C 知识量:16 - 74 - 317
指针是一个值为内存地址的变量(或数据对象)。例如:
color = &red;
其中,color就是一个指针,而&就是地址运算符,用于表示变量的内存地址。以上语句可以称为color指向red。color与&red的区别是:color是变量,而&red是常量(即内存地址)。
如果color指向red,即:
color = &red;
可以使用间接运算符*找出存储在red中的值,该运算符有时也称为解引用运算符。间接运算符与二元乘法运算符使用的符号相同,但是语法功能不同。
var = *color;
将语句color=&red;和var=*color;放在一起相当于下面的语句:
var = red;
因此,使用地址和间接运算符可以间接完成上面这条语句的功能,这也是间接运算符名称的由来。
声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间,一些指针操作要求知道操作对象的大小。另外,程序必须知道存储在指定地址上的数据类型。以下是一些指针的声明示例:
int * pi; //pi是指向int类型变量的指针 char * pc; //pc是指向char类型变量的指针 float *pf,*pg; //pf、pg都是指向float类型变量的指针
类型说明符表明了指针所指向对象的类型,星号(*)表明声明的变量是一个指针。
以上示例中,pc指向的值(*pc)是char类型,而pc本身的类型称为“指向char类型的指针”。pc的值是一个地址,在大部分系统内部,该地址由一个无符号整数表示。但是,不要把指针认为是整数类型。一些处理整数的操作不能用来处理指针,反之亦然。例如,可以把两个整数相乘,但是不能把两个指针相乘。
指针实际上是一个新类型,不是整数类型。ANSI C专门为指针提供了%p格式的转换说明。
可以利用指针在函数间进行通信。通常,值的传递可以分为值传递和引用传递,使用变量值进行传递的方式为值传递;使用变量地址进行传递的方式为引用传递。以下是一个示例:交换变量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()可以访问存储在这些位置的值,并直接改变它们。这是引用传递与值传递最大的区别。
一般而言,如果只是计算或处理值,可以使用值传递;如果要在被调用函数中改变主调函数的变量,则应当使用引用传递,即利用指针进行通信。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6