C提供了6种基本的指针操作,下面的程序演示这些操作:
//ptr_ops.c --指针操作
#include
int main(void)
{
int urn[5] = { 100,200,300,400,500 };
int * ptr1, *ptr2, *ptr3;
ptr1 = urn;//把一个地址赋给指针
ptr2 = &urn[2]; //同上
//取得指针指向的值
//并且得到指针的地址
printf("pointer value,dereferenced pointer,pointer address:\n");
printf("ptr1=%p,*ptr=%d,&ptr1=%p\n", ptr1, *ptr1, &ptr1);
/*指针加法*/
ptr3 = ptr1 + 4;
printf("\n adding an int to a pointer:\n");
printf("ptr1+4=%p,*(ptr4+3)=%d\n", ptr1 + 4, *(ptr1 + 3));
ptr1++;//递增指针
printf("\n values after ptr1++\n");
printf("ptr1=%p,*ptr1=%d,&ptr1=%p\n", ptr1, *ptr1, &ptr1);
ptr2--;//递减指针
printf("\n values after --ptr2\n");
printf("ptr2=%p,*ptr2=%d,&ptr=%p\n", ptr2, *ptr2, &ptr2);
--ptr1; //恢复为初始值
++ptr2; //恢复为初始值
printf("\n pointer reset to orignal values:\n");
printf("ptr1=%p,ptr2=%p\n", ptr1, ptr2);
//一个指针减去另一个指针
printf("\n subtracting one pointer from another:\n");
printf("ptr2=%p,ptr1=%p,ptr2-ptr1=%d\n", ptr2, ptr1, ptr2 - ptr1);
//一个指针减去一个整数
printf("\n subtracting an int from a pointer:\n");
printf("ptr3=%p,ptr3-2=%p\n", ptr3, ptr3 - 2);
return 0;
}
输出结果如下:
pointer value,dereferenced pointer,pointer address:
ptr1=0101FDA4,*ptr=100,&ptr1=0101FD98
adding an int to a pointer:
ptr1+4=0101FDB4,*(ptr4+3)=400
values after ptr1++
ptr1=0101FDA8,*ptr1=200,&ptr1=0101FD98
values after --ptr2
ptr2=0101FDA8,*ptr2=200,&ptr=0101FD8C
pointer reset to orignal values:
ptr1=0101FDA4,ptr2=0101FDAC
subtracting one pointer from another:
ptr2=0101FDAC,ptr1=0101FDA4,ptr2-ptr1=2
subtracting an int from a pointer:
ptr3=0101FDB4,ptr3-2=0101FDAC
下面的列表描述了可对指针变量执行的基本操作:
C保证指向数组元素的指针和指向数组后的第一个地址的指针都是有效的。但是如果指针在进行了增量或减量运算后超出这个范围,后果将是未知的。另外,可以对指向一个数组元素的指针进行取值运算,但是不能对指向数组后第一个元素的指针进行取值运算,尽管这样的指针是合法的。
对未初始化的指针取值
使用指针,有一个规则需要注意:不能对未初始化的指针取值。例如下面的例子:
int * pt; //未初始化的指针
* pt=5; //一个可怕的错误
为什么这样的代码危害极大?这段程序的第二行表示把数值5存储在pt指向的地址。但是由于pt没有被初始化,因此它的值是随机的,不知道5会被存储到哪儿。这个位置也许对系统危害不大,但也许会覆盖程序数据或者代码,甚至导致程序崩溃。切记:当创建一个指针时,系统只分配用来存储指针本身的内存空间,并不分配用来存储数据的内存空间。因此在使用指针之前,必须给它赋予一个已分配的内存地址。