一、概念
二维数组是一维数组的延伸,一维数组中的a[0],a[1],a[2]...代表的是数据,而二维数组中的a[0],a[1],a[2]....则代表的是地址,a[0][1],a[1][2]...代表的才是数据。
二、举例分析与指针的关系
(1)a[3][4],代表的是3行4列的数组,int *p = a; printf("%d\n",(*(p+2*4+2))); 这样就可以输出对应于a[2][2]的元素。
(2)printf("%d\n",*(a[2]+2)); 同样也能输出
a[2][2]的元素。
(3)printf("%d\n",*(*(a+2)+2)); 同样也能输出a[2][2]的元素。
(4)int (*p)[
4] = a; printf("%d\n",*(*(p+1)+2)); 这个是比较难以理解的,要好好理解一下,注意
数值指针 p 指向的一维数组元素是4
其输出的相当于元素a[1][2]。
三、代码实例分析
-
/***Z
-
==================================================================
-
3个学生各4门成绩,计算所有学生成绩的平均分,并输出第n个学生的成绩
-
采用指针的方式
-
==================================================================
-
H***/
-
-
#include <stdio.h>
-
#include <string.h>
-
-
int main()
-
{
-
-
double sums(int (*f)[4], int j); // 求和函数声明
-
int i;
-
double avg[3], Sum;
-
int n;
-
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
-
-
//int *p = a;
-
//printf("%d\n",(*(p+2*4+2)));
-
-
int (*p)[4] = a;
-
printf("%d\n",*(*(p+1)+2));//注意p其实是一个指针,也就是一个地址,先向下移动一个,在向右移动三个
-
-
-
printf("%d\n",a[2][2]);
-
printf("%d\n",*(a[2]+2));
-
printf("%d\n",*(*(a+2)+2)); //这三种方式的输出结果是相同的
-
-
-
-
for(i = 0; i < 3; i++) //分别输出3个学生的平均成绩
-
{
-
Sum = sums(a, i);
-
avg[i] = Sum/4;
-
printf("avg[%d] = %4.02lf\n",i,avg[i]);
-
}
-
-
printf("请输入第n个学生:"); //以下代码是输出第几个学生的成绩
-
scanf("%d", &n);
-
if(n > 0 && n < 4)
-
{
-
printf("%d的成绩:%d,%d,%d,%d\n",n,*(*(a+n-1)),*(*(a+n-1)+1),*(*(a+n-1)+2),*(*(a+n-1)+3));
-
}
-
else printf("Input Error\n");
-
-
return 0;
-
}
-
-
double sums(int (*f)[4], int j) //求和函数
-
{
-
double sum;
-
sum = *(*(f+j)+0) + *(*(f+j)+1) + *(*(f+j)+2) + *(*(f+j)+3);
-
return sum;
-
}
其运行结果如下:
其中前四行的7,11,11,11,11是对前面输出结果的验证。
阅读(1449) | 评论(0) | 转发(0) |