指针提供了一种用来使用地址的符号方法。指针能够有效地处理数组。数组标记实际上就是一种变相使用指针的形式。数组名同时也是该数组首元素的地址。
例如下面这样程序:
#include <stdio.h>
#define SIZE 4
int main()
{
short data[SIZE];
short *pti;
short index;
double bills[SIZE];
double *ptf;
pti=data;
ptf=bills;
printf("%20s %10s \n","short","double");
for(index=0;index<SIZE;index++)
{
printf("pointer+%d:%10p %10p\n",index,pti+index,ptf+index);
printf("pointer+%d:%10p %10p\n",index,data+index,bills+index);
}
return 0;
}
输出如下:
short double
pointer+0:0xbf96697c 0xbf966958
pointer+0:0xbf96697c 0xbf966958
pointer+1:0xbf96697e 0xbf966960
pointer+1:0xbf96697e 0xbf966960
pointer+2:0xbf966980 0xbf966968
pointer+2:0xbf966980 0xbf966968
pointer+3:0xbf966982 0xbf966970
pointer+3:0xbf966982 0xbf966970
此处data,bills是数组首元素的地址,data+index、bills+index是数组data、bills的第index个元素的地址。
short类型是使用2个字节,double 类型使用8个字节。指针说明符%p是用于显示地址,通常以十六进制显示。
对一个指针加1的结果就是对该指针增加1个存储单元。对于数组而言,地址会增加到下一个元素的地址,而不是下一个字节。
1)指针的数值就是它指向的对象的地址。地址的内部表示方式由硬件来决定。对于包含多个字节的数据类型,比如double类型的变量,对象的地址通常指的是其首字节的地址。
2)在指针前运用*运算符就可以得到该指针所指向的对象的数值。
3)对指针加1,等价于对指针的值加上它所指向的对象的字节大小。
对于下面的语句:
data+2==&data[2]; //相同的地址
*(data+2)=data[2]; // 相同的值
说明了数组与指针的密切关系:可以用指针标识数组的每个元素,并得到每个元素的数值。从本质上说,对同一种对象有两种不同的符号表示方法。
例如,定义a[n]时,意思是*(a+n),即“寻址到内存中的a,然后移动n个单位,再取出数值”。