如果引入一個新類型的變量(例如p),使p等於變量的地址,*p代表變量的值,即對於上面的例子,只要使「p=&a」就使p存儲了變量a的地址&a,而「*p」就是a的值,這就大大簡化了表達式。通過聲明一個指針變量,就可以實現這種操作。
int a=25 ; int *p ; p=&a ;
雖然p是指針變量,但這個變量與基本變量不一樣。基本變量與基本數據類型相對應,如int變量存儲整型值,char變量存儲字符值,等等。但指針變量p存儲的是地址值,所以
printf ("%p\n" ,p );
語句輸出的是存儲變量x的地址,它和語句
printf ("%d" ,&x );
是等效的,都是輸出十六進制地址值「0012FF7C」(其實,這個值取決於機器)。而且不管是何種類型的指針,編譯器都給它分配4個字節。
既然p具體存放的地址是內存裡存放變量a的地址,*p就是這個地址所保存的值,也就是變量a的值。所以語句
printf ("%d" ,a );
輸出變量a的值25,它的等效語句是
printf ("%d\n" ,*p );
下面是一個完整的演示程序。對比它們的輸出,就會明白其中的奧妙。
【例2.16】演示輸出指針的例子。
#include <stdio.h> void main ( ) { int a=25 ,*p ; p=&a ; printf ("%d ,0x%p\n" , a , &a ); printf ("%d ,0x%p\n" , *p , p ); }
使用「0x」標識地址是十六進制,程序輸出如下。
25 ,0x0012FF7C 25 ,0x0012FF7C