C语言指针基础知识点(六)--通过指针引用多维数组
前期回顾 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过指针引用数组 C语言指针基础知识点(五)–用数组名作函数参数通过指针引用多维数组1. 多维数组元素的地址请记住:*(a+i) 和 a[i] 是等价的如果 a 是一维数组名,a...
指针系列目录
C语言指针基础知识点(一)–指针及指针变量
C语言指针基础知识点(二)–指针变量的引用
C语言指针基础知识点(三)–指针变量作为函数参数
C语言指针基础知识点(四)–通过指针引用数组
C语言指针基础知识点(五)–用数组名作函数参数
C语言指针基础知识点(六)–通过指针引用多维数组
C语言指针基础知识点(七)–通过指针引用字符串
C语言指针基础知识点(八)–返回指针值的函数
C语言指针基础知识点(九)–指针数组和多重指针
C语言指针基础知识点(十)–动态内存分配与指向它的指针变量
通过指针引用多维数组
1. 多维数组元素的地址
请记住: *(a+i)
和 a[i]
是等价的
如果 a 是一维数组名,a[i] 代表 a 数组序号为 i 的元素的存储单元。
如果 a 是一维数组名,则 a[i] 是一维数组名,它只是一个地址,并不代表某一元素的值。
二维数组
一个3行4列的二维数组,他有3行4列,定义为:
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
二维数组 a 的有关指针
表示形式 | 含义 | 地址 |
---|---|---|
a | 二维数组名,指向一维数组a[0],即0行首地址 | 2000 |
a[0],*(a+0), *a | 0行0列元素地址 | 2000 |
a+1, &a[1] | 1行首地址 | 2016 |
a[1],*(a+1) | 1行0列元素 a[1][0]的地址 | 2016 |
a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素 a[1][2]的地址 | 2024 |
*(a[1]+2), ((a+1)+2), a[1][2] | 1行2列元素 a[1][2]的值 | 元素值为13 |
再次强调: 二维数组名( 如a )是指向行的。因此a + 1
中的 “1’’ 代表一行中全部元素所占的字节数 。 一维数组名 (如a[0]
,a[1]
)是指向列元素的。a[0] + 1
中的1代表一个 a
元素所占的字节数。在指向行的指针前面加一个 *,就转换为指向列的指针。 例如,a
和 a+1
是指向行的指针,在它们前面加一个 * 就是 *a
和 *(a+1)
,它们就成为指向列的指针,分别指向a
数组0
行0
列的元素和1
行0
列的元素。反之,在指向列的指针前面加&
,就成为指向行的指针。例如 a[0] 是指向0
行0
列元素的指针,在它前面加一个&
,得&a[0]
,由于a[0]
与 *(a+0)
等价,因此 &a[0]
与&*a
等价,也就是与a
等价,它指向二维数组的 0
行。
栗子1:
输出二维数组的地址和值
# include<stdio.h>
int main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
printf("%d,%d\n", a, *a); // 0行首地址和0行0列元素地址
printf("%d,%d\n", a[0], *(a+0)); // 0行0列元素地址
printf("%d,%d\n", &a[1][0], *(a+1)+0); // 1行0列元素地址
printf("%d,%d\n", &a[2], *(a+2)); // 2行0列元素地址
printf("%d,%d\n", a[1][0], *(*(a+1)+0)); // 0行0列元素
printf("%d,%d\n", *a[2], *(*(a+2)+0)); // 2行0列元素
return 0;
}
2. 指向多维数组元素的指针变量
(1) 指向数组元素的指针变量
栗子2:
用指向数组元素的指针变量输出二维数组各元素的值
# include<stdio.h>
int main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
int *p;
for(p=a[0];p<a[0]+12;p++) // 使p依次指向下一个元素
{
if (p !=a[0] && (p-a[0])%4 == 0)
printf("\n");
printf("%4d", *p);
}
printf("\n");
return 0;
}
(2) 指向由m个元素组成的一维数组的指针变量
栗子3:
输出二维数组任一行任一列元素的值
# include<stdio.h>
int main()
{
int a[3][4] = {1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4], i ,j; //指针变量 p 指向包含4个整型元素的一维数组
p=a; // p指向二维数组的0行
printf("please enter row and column:\n");
scanf("%d,%d",&i, &j); //输出要求输出的元素的行列号
printf("a[%d,%d]=%d\n", i,j,*(*(p+i)+j)); // 输出a[i][j]的值
printf("\n");
return 0;
}
(3) 用指向数组的指针作函数参数
栗子4:
有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生成绩
#include <stdio.h>
int main()
{
void average(float *p,int n);
void search(float (*p)[4],int n);
float score[3][4]={{65,67,70,60},{80,87,90,81},{90,99,100,98}};
average(*score,12); //求12个分数的平均分
search(score,2); //求序号为2的学生的成绩
return 0;
}
void average(float *p,int n)
{
float *p_end;
float sum=0,aver;
p_end=p+n-1; // n的值为12时,p_end 的值是 p+11,指向最后一个元素
for(;p<=p_end;p++)
sum=sum+(*p);
aver=sum/n;
printf("average=%5.2f\n",aver);
}
void search(float (*p)[4],int n)
{
int i;
printf("The score of No.%d are:\n",n);
for(i=0;i<4;i++)
printf("%5.2f ",*(*(p+n)+i));
printf("\n");
}
栗子5:
查找一门以上课程不及格的学生,输出他们的全部课程的成绩
#include <stdio.h>
int main()
{
void search(float(*p)[4],int n);
float score[3][4]={{65,57,70,60},{58,87,90,81},{90,99,100,98}};
search(score,3);
return 0;
}
void search(float(*p)[4],int n)
{
int i,j,flag;
for(j=0;j<n;j++)
{
flag=0;
for(i=0;i<4;i++)
if(*(*(p+j)+i)<60)flag=1;
if(flag==1)
{
printf("NO.%d fails,his score are:\n",j+1);
for(i=0;i<4;i++)
printf("%5.1f",*(*(p+j)+i));
printf("\n");
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)