对C/C 中多维数组指针的理解

2008-02-23 05:24:38来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的,因此对于多维数指针的理解是个比较难,需要反复观察,谨慎使用,假如多维数组的概念不清楚那就需要从C/C 基础学起注意知识的积累!

 C 代码 
/*程式作者:管宁 

任何稿件均有版权,如要转载,请务必著名出处和作者*/

 
#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/* 把a[0]的地址赋予指针变量p,条件判断p
 { 
  if((p-a[0])%4==0) /* 利用整数指针变量p减去当前地址判断出是不是已显示出了四个值,换行回车 */
  { 
   printf("\n"); 
  } 
  printf("M",*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)。
*/

  下面这个例子能够帮助我们理解多维数组指针作为函数参数传递的使用方法,通过这段代码能够帮助您更好的理解多位数组指针。

 C 代码 
 
/*程式作者:管宁 

任何稿件均有版权,如要转载,请务必著名出处和作者*/

 
#include  
 
main() 
{ 
 void search_score(); /* 定义自定义涵数类型为不返回型 */
 void count_avg(); /* 定义自定义涵数类型为不返回型 */
 static float a[3][4]={{97,45.5,66,77},{88,92.5,78.5,66},{83,74.5,92,100}}; /* 输入3个学生的各自4门课的成绩 */
 search_score(a,0); /* 调换自定义涵数显示其中一个同学的各门课成绩 */
 count_avg(*a,12); /* 调换自定义涵数显示3个同学各门课的平均成绩成绩 */
 /* 注意上面的*a其实也就是a[0]或是&a[0][]0将这行改写成count_avg(a[0],12);或count_avg(&a[0][0],12)也都是对的 */
} 
 
void search_score(p,n) 
float (*p)[4]; /* 定义一个指针变量p,说明他是个指向一个包含4个整型变量一维数组的指针 */
int n; /* 定义形式参数n为整形 */
{ 
 int i; /* 定义用于循环的变量i */
 for (i=0;i<4;i  ) /* 这里循环4次用于打印一个同学的4门课成绩 */
 { 
  printf("%7.2f",*(*(p n) i)); 
 } 
 printf("\n"); 
} 
 
void count_avg(p,n) 
float *p; 
int n; 
{ 
 float *p_end; 
 float sum = 0; 
 float avg; 
 p_end = p n-1; /* 计算出最后一个数组元素的地址 */
 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 程式设计从零开始之赋值操作符

下一篇: 对C 程式设计中函数重载的探讨