C++ 数组和指针学习总结(三)

2014-11-24 02:02:54 · 作者: · 浏览: 5
]
#include     
 
main() 
{ 
 static  int  a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /* 定义一个3行4列的二维数组 */
 int  *p; 
 printf ("%d %d/n",a,*a); 
 printf ("%d %d/n",a[0],*(a+0)); 
 printf ("%d %d/n",&a[0],&a[0][0]); 
 printf ("%d %d/n",a[0][0],*(*(a+0)+0)); 
 for  (p=a[0];p
 { 
  if ((p-a[0])%4==0) /* 利用整数指针变量p减去当前地址判断出是不是已经显示出了四个值,换行回车 */
  { 
   printf ("/n"); 
  } 
  printf ("%4d",*p); /* 打印出元素的值 */
 } 
 printf ("/n"); 
} 
 
/* 
第 5行中的a和*a打印出来的值,就会让人弄不明白我们知道数组传递的地址那么a表示这个数组的其实地址为什么*a却不是实际值呢?原因是在多维数组中 a+0表示的是第0行的首地址,a+1表示是第一行的首地址,那么*a其实就是*(a+0),那么第一个元素其实是a[0][0]
而*(a+0) 仅仅是把一个3行4列的二维数组拆为了三个一维数组,*(a+0)显然表示的不是物理位置也就不可能得到第一个元素的值了,它仅仅是一个内存地址也就是第 0行的启始地址,再看8行中的*(*(a+0)+0),它表示的则是第0行第0列个元素的值也就是a[0][0],再次强调*(a+0)表示的是数组第一行的首地址,也就是第二行的*(a+1),而元素值要得到显然就是*(*(a+0)+0)了如果是第0行第1个也就是*(*(a+0)+1)。
*/