1、先从最基本的概念开始。&是地址运算符。当它后面是一个变量名时,&给出该变量的地址。*是间接或解引用运算符。当它后面是一个指针时,*给出储存在指针指向地址中的值。数组名是数组首元素的地址。也就是说,如果 flizny 是一个数组,下面的语句成立:flizny == &flizny[0]; 另外,需要注意C语言运算符的优先级。间接运算符(*)的优先级高于+,如果dates是个数组名,则* dates+2相当于( * dates)+2:* (dates + 2) // dates 第 3 个元素的值* dates + 2 // dates 第 1 个元素的值加 2
2、先以这段程序为例。注意指针加上一个数时,它的值发生了什么变化(代码中的转换说明%p会以十六进制显示指针的值)。
3、这是它的输出。经过分析可以得出,我的电脑中,地址按字节编址,short类型占用2字节,double类型占用 8 字节。在C语言中,指针加1指的是增加一个存储单元。对数组而言,这意味着加1后的地址是下一个元素的地址,而不是下一个字节的地址。
4、然后再提升难度,开始探讨多维数组。增加数组维数会增加指针的复杂度。以这段程序为例:
5、这是上面代码的运行结果。因为zippo和zippo[0]都开始于同一个地址,所以的值相同。结果显示出zippo[0]是一个占用一个int大小对象的地址,而 zippo 是一个占用两个int大小对象的地址。因为zippo[0]是该数组首元素(zippo[0][0])的地址,所以* (zippo[0])表示储存在zippo[0][0]上的值(即一个int类型的值)。与此类似,* zippo代表该数组首元素(zippo[0])的值,而zippo[0]是个地址。该值的地址是&zippo[0][0],即* zippo就是&zippo[0][0]。** zippo与* &zippo[0][0]等价,这相当于zippo[0][0]。简而言之,zippo是地址的地址,必须解引用两次才能获得原始值。
6、zippo:二维数组首元素的地址(每个元素都是内含两个坡纠课柩int类型元素的一维数组)zippo+2:二维数组的第3个元素烫喇霰嘴(即一维数组)的地址* (zippo+2):二维数组的第3个元素(即一维数组)的首元素(一个int类型的值)地址* (zippo+2) + 1:二维数组的第3个元素(即一维数组)的第2个元素(也是一个int类型的值)地址* ( * (zippo+2) + 1):二维数组的第3个一维数组元素的第2个int类型元素的值,即数组的第3行第2列的值(zippo[2][1])下图更直观地演示了数组地址、数组内容和指针之间的关系。