指针

本文主要介绍一下C语言中的指针。

什么是指针

指针就是地址,而指针变量就是存储地址的变量。

虽然用数表示地址,但是地址的取值范围可能不同于整数的范围,所以一定不能用普通整型变量存储地址。

指针变量的声明

对指针变量的声明与对普通变量的声明基本一样,唯一的不同就是必须在指针变量名字前放置星号:

1
int *p;

上述声明说明p是指向int类型对象的指针变量。

取地址运算符和间接寻址运算符

取地址运算符:如果x是变量,那么**&x**就是x在内存中的地址。

间接寻址运算符:为了获得对指针所指向对象的访问,可以使用(间接寻址)运算符。如果p是指针,那么*p表示p当前指向的对象。

一旦指针变量指向了对象,就可以使用*(间接寻址)运算符访问存储在对象中的内容。

1
j = *&i;      /* same as j = i; */

指针赋值

C语言允许使用赋值运算符进行指针的复制,前提是两个指针具有相同的类型。

赋值语句*q = *p;是把p指向的值(i的值)复制到q指向的对象(变量j)中。

指针作为参数

声明相应的形式参数p为指针。调用函数时,p的值为&x,因此p(p指向的对象)将是x的别名。函数体内*p的每次出现都将是对x的间接引用,而且允许函数既可以读取x也可以修改x。

1
2
3
4
5
void decompose(double x, long *int_part, double *frac_part)
{
*int_part = (long) x;
*fract_part = x - *int_part;
}

用const保护参数

当调用函数并且把指向变量的指针作为参数传入时,通常会假设函数将修改变量,但是,仅需要检查变量的值而不是改变它的值也是可能的。可以使用单词const来表明函数不会改变指针参数所指向的对象。const应放置在形式参数的声明中,后面紧跟着形式参数的类型说明:

1
2
3
4
void f(const int *p)
{
*p = 0; /*** WRONG ***/
}

这一用法表明p是指向“常整数”的指针。试图改变*p是编译器会检查的一种错误。

指针作为返回值

永远不要返回指向自动局部变量的指针,一旦函数返回,局部变量就不存在了,所以指向局部变量的指针将是无效的。

微信公众号 长夜西风

个人网站 http://www.cmder.info/

书痴者文必工,艺痴者技必良。