`

指针和多维数组

 
阅读更多

摘自:《C primer plus》

 

指针和多位数组

假设声明如下:

int zippo[4][2];

数组名zippo同时也是数组首元素的地址。在本例中能够,zippo的首元素本身又是包含两个int的数组,因此zippo也是包含两个int 的数组的地址。下面从指针属性进一步分析:

  • 意味zippo是数组首元素的地址,所以zippo的值和&zippo[0]相同。另一方面,zippo[0]本身是包含两个整数的数组,因此zippo[0]的值同其首元素(一个整数)的地址&zippo[0][0]相同。简单地说,zippo[0]是一个整数大小对象的地址,而zippo是两个整数大小对象的地址。因为整数和两个整数组成的数组开始与同一个地址,因此zippo和zippo[0]就有相同的数值。
  • 对一个指针(也即地址)加1,会对原来的数值加上一个对应类型大小的数值。在这方面,zippo和zippo[0]是不一样的,zippo所指向对象的大小是两个int,而zippo[0]所指向对象的大小是一个int。因此zippo+1和zippo[0]+1结果不同。
  • 对一个指针(也即地址)取值(使用运算符*或者带有索引的[]运算符)得到的是该指针所指向对象的数值。因为zippo[0]是其首元素zippo[0][0]的地址,所以*(zippo[0])代表存储在zippo[0][0]中的值,即一个int数值。同样,*zippo代表其首元素zippo[0]的值,但是zippo[0]本身就是一个int数的地址,即&zippo[0][0],因此*zippo是&zippo[0][0]。对着两个表达式同时应用取值运算符将得到**zippo等价*&zippo[0][0],后者简化后即为一个int数zippo[0][0].简言之,zippo是地址的地址,熏药两次取值才可以得到通常的数值。地址的地址或指针的指针是双重间接(double indirection)的典型例子。
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics