指针是C语言最重要的特性之一。字节是大多数的现代计算机的基本存储单元,每个字节可存储8位的信息,都有唯一的地址。程序中的每个存储单元占用一个或多个字节,将第一个字节的地址成为该存储单元的地址,也就是指针。用以存储地址的变量称为指针变量。指针变量p
存储某存储单元(变量i
)的地址时,称作该p
指向i
。
指针变量的声明
声明一个指向某一类型对象的指针变量的格式如下:
类型名 *指针变量名;
类型名没有限制。
指针变量的赋值
取地址运算符(&
)用以获取变量的地址,间接寻址运算符(*
)访问指针变量指向的对象。不要把间接取值运算符用于未初始化的指针变量,因为此时该指针变量未定义,可能指向内存中的任何地方。
同其他类型的变量一样,指针变量也可以被赋值,但值必须是相同类型的指针。当把指针变量赋给另一个指针变量时,则这两个指针变量指同一个存储单元。任意数量的指针变量可以指向同一个内存单元。
/**************************************
* pointer_1.c *
* *
* C语言中指针变量的声明和赋值 *
**************************************/
#include <stdio.h>
int main()
{
int i, *p, *q;
i = 10;
p = &i;
q = p;
printf("i的地址为%p\n", &i);
printf("p的值为%p\n", p);
printf("i的值为%d\n", i);
printf("p指向的变量的值为%d\n", *p);
printf("q的值为%p\n", q);
printf("q指向的变量的值为%d\n", *q);
return 0;
}
指针作为函数的参数
使用指针作为函数的参数,在调用函数时传入变量的指针,可在函数内改变变量的值。
通常,编译器都会提供检测参数类型,保证为指针变量传入正确的值。但scanf
函数通常不会检查传递指针失败,容易造成错误。
/**************************************
* pointer_2.c *
* *
* C语言中的指针作为函数参数 *
**************************************/
#include <stdio.h>
void decompose(float x, int *int_part, float *frac_part)
{
*int_part = (int)x;
*frac_part = x - *int_part;
}
int main()
{
float x = 0.0f;
printf("输入一个浮点数:");
scanf("%f", &x);
int int_part = 0;
float frac_part = 0.0f;
decompose(x, &int_part, &frac_part);
printf("%g的整数部分为%d,小数部分为%g\n", x, int_part, frac_part);
return 0;
}
指针作为函数参数除了可以在函数内改变变量的值外,还有一个原因是需要传给函数的值可能需要很大的存储空间,利用值传递需要进行赋值花费很大的时间和空间,因此可以传入指针直接访问变量。可以通过const标识符修饰函数定义中的指针变量,声明函数不能改变传入的指针指向的对象。若试图改变,则会报错。
/***************************************
* pointer_3.c *
* *
* C语言中const修饰的指针形式变量不能 *
* 修改指向的变量 *
***************************************/
#include <stdio.h>
void f(const int *p)
{
*p = 10;
}
int main()
{
int i = 0;
f(&i);
printf("i = %d\n", i);
return 0;
}
指针作为返回值
返回的指针变量要么是通过实际参数传入的指针,或者是实际参数传入的数组或数组的某一个元素,也或者是执行外部变量或声明为static的局部变量等,但不能返回执行函数内部局部变量的指针,因为当函数返回该变量的内存空间就被释放了,指向改变了的指针就无效了。
/**************************************
* pointer_4.c *
* *
* C语言的指针作为返回值 *
**************************************/
#include <stdio.h>
int *max(int *a, int *b)
{
if (*a > *b)
return a;
else
return b;
}
int main()
{
int a = 0;
int b = 0;
printf("请输入两个整数:");
scanf("%d%d", &a, &b);
printf("%d和%d中较大的一个数为%d\n", a, b, *max(&a, &b));
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社