从根本上看,指针(pointer)是一个值为内存地址的变量(或数据对象)。假如已知ptr指向bah,如下所示:
ptr = &bah;
然后使用间接运算符 *(indirection operator)找出储存在bah中的值,该运算符有时也称为解引用运算符(dereferencing operator)。
声明指针变量时必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间,一些指针操作要求知道操作对象的大小。另外,程序必须知道存储在指定地址上的数据类型。long和float可能占据相同的存储空间,但是它们存储数字却大相径庭。
char * pc;
pc指向的值(*pc)是char类型。pc的值是一个地址,在大多数系统内部,该地址由一个无符号整数表示。但是,不要把指针认为是整数类型。指针实际上是一个新类型。
编写程序时,可以认为变量有两个属性:名称和值(还有其他性质,如类型,暂不讨论)。计算机编译和加载程序后,认为变量也有两个属性:地址和值。地址就是变量在计算机内部的名称。
在C中,可以通过&运算符访问地址,通过*运算符获得地址上的值。
简而言之,普通变量把值作为基本量,把地址作为通过&运算符获得的派生量,而指针变量把地址作为基本量,把值作为通过*运算符获得的派生量。
指针提供一种以符号形式使用地址的方法。因为计算机的硬件指令非常依赖地址,指针在某种程度上把程序员想要传达的指令以更接近机器的方式表达。
数组名是数组首元素的地址。也就是说,如果flizny是一个数组,下面的语句成立:
flizny == &flizny[0];
flizny和&flizny[0]都表示数组首元素的内存地址(&是地址运算符)。二者都是常量,在程序的运行过程中,不会改变。但是,可以把它们赋值给指针变量,然后可以修改指针变量的值。
short datas[4]; short * pti; pti = datas; for(int index = 0; index < 4; index++, pti++){ printf("pointers + %d: %10p \n", index, pti); }