指针是一种类型修饰型变量,定义数组变量时使用[]与其它单一变量进行类型区别。类似的,定义指针变量时则使用'*'号指示区别。
示例代码中,前两种指针变量定义的方式是一致的,这代表着两种不同的编码风格,使用哪种取决于你的喜好。只是从代码审阅的角度讲,两者的侧重点不同。
变量存在一种从右向左的读法,方法是从变量名(或最后一个修饰词)开始向左阅读,对于第一个变量,可以读作:pi是一个变量,这个变量是一个指针,指针类型是int。连接起来就是:pi是一个指针,该指针指向一个整型变量。现在你尝试使用这种方式读一下第二个变量,你就会发现除了类型,它们的读法是一致的。
对指针变量进行初始化相当有必要,否则很容易引起程序中断。在这里我们把它初始化为0,表示不指向任何对象。指针不指向任何对象,也就没有多少价值。我们没有为pf进行初始化,是因为我确信后面会给它进行正确的赋值,如果你不能保证这一点,那就初始化为0。
指向我们再把pi的类型读一次:pi是一个指针,该指针指向一个整型变量。这表明pi最终需要指向一个int变量。一个指向操作在C语言中是使用取地址运算符(&)来表示的。
定义一个变量就代表要分配一定字节的内存,对于变量b,系统会分配sizeof(int)个字节大小的空间以便容纳一个整型值。你可以把这个空间想象成一个盒子,盒子里放着数值5。这个盒子有一个编号,这个编号就是内存地址。指针的指向(即被赋值)就代表把盒子的地址交给它。由此可知,pa、pb的值有两个特性。首先pa、pb的值是一个地址;再次这个地址与被指向的变量地址是相同的。
打印地址可以使用%p来打印一个指针的值,地址值通常用16进制表示,为了更清楚的表明这一点,我们在输出值前面加上了0x标志。注意观察结果,pa与&a的值是一样的,表示它们指向同一个值,pb同理。
使用指针持有的值指向会让指针有一个合法的地址值。如果把你自己想像成一个指针,指向相当于你抱起了一个大盒子,盒子中的东西就是你所持有的值,至于盒子中是什么东西,需要打开盒子看看才能知道,这个打开查看的动作,对应于指针,就叫解引用指针,通过解引用操作符(*)来实现的。
这篇教程作为指针的起步,希望你能好好理解并掌握这些概念:指向、持有地址、访问值。