对于多维理解比较困难这也是由于和维指针含义有冲突造成因此对于多维数指针理解是个比较难需要反复观察谨慎使用如果多维概念不清楚那就需要从c/c基础学起注意知识积累!
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#
{
a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /* 定义个3行4列 2维 */
*p;
prf(\"%d %d\\n\",a,*a);
prf(\"%d %d\\n\",a[0],*(a+0));
prf(\"%d %d\\n\",&a[0],&a[0][0]);
prf(\"%d %d\\n\",a[0][0],*(*(a+0)+0));
for (p=a[0];p/* 把a[0]地址赋予指针变量p,条件判断p
{
((p-a[0])%40) /* 利用整数指针变量p减去当前地址判断出是不是已经显示出了 4个值,换行回车 */
{
prf(\"\\n\");
}
prf(\"%4d\",*p); /* 打印出元素值 */
}
prf(\"\\n\");
}
/*
第5行中a和*a打印出来值就会让人弄不明白我们知道传递地址那么a表示这个其实地址为什么*a却不是实际值呢?原因是在多维中a+0表示是第0行首地址a+1表示是第行首地址那么*a其实就是*(a+0)那么第个元素其实是a[0][0]
而*(a+0)仅仅是把个3行4列 2维拆为了 3个维*(a+0)显然表示不是物理位置也就不可能得到第个元素值了它仅仅是个内存地址也就是第0行启始地址再看8行中*(*(a+0)+0)它表示则是第0行第0列个元素值也就是a[0][0]再次强调*(a+0)表示是第行首地址也就是第 2行*(a+1)而元素值要得到显然就是*(*(a+0)+0)了如果是第0行第1个也就是*(*(a+0)+1)
*/
> 下面这个例子可以帮助我们理解多维指针作为参数传递使用思路方法通过这段代码可以帮助你更好理解多位指针
/*作者:管宁
所有稿件均有版权,如要转载,请务必著名出处和作者*/
#
{
void search_score; /* 定义自定义涵数类型为不返回型 */
void count_avg; /* 定义自定义涵数类型为不返回型 */
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个整型变量维指针 */
n; /* 定义形式参数n为整形 */
{
i; /* 定义用于循环变量i */
for (i=0;i<4;i ) /* 这里循环4次用于打印个同学4门课成绩 */
{
prf(\"%7.2f\",*(*(p+n)+i));
}
prf(\"\\n\");
}
void count_avg(p,n)
float *p;
n;
{
float *p_end;
float sum = 0;
float avg;
p_end = p+n-1; /* 计算出最后个元素地址 */
for (;p<=p_end;p) /* 循环到最后个元素地址就停止 */
{
sum *p;
}
avg = sum/n;
prf(\"avg=%7.2f\\n\",avg);
}
/*
注意此题意思在于输入3个同4门课成绩计算出平均值和显示其中个同学4门课成绩此例是对多维指针和多维
指针作为涵数参数传递整理总结认真联系和体会可以很好了解多维指针概念到底是什么!
*/
>
最新评论