通过指针引用多维数组
相较于一维数组,二维数组可以理解为数组中的数组,而用指针引用二维则与二级指针有关。
难点是与一维数组有重合部分但赋予了新概念。补充:对于(a+i)这样的形式可以理解为另设一个指针变量储存a【i】的地址,方便记忆。
设a为二维数组名,从二维数组角度看,代表第零行零列元素a【0】【0】即&a【0】【0】也就是二维数首元素的地址,指向a【0】也称0行起始地址,此时的首元素并不代表一个整形元素,而是代表一个由4个整型元素所组成的一维数组,这里统一二维数组为a【3】【3】。
这里做下区分和定义。
a+1代表第一行零列起始地址,a+n(自然数)代表第几行,,a【n】+n代表列的增加(只有在出现行时,也就是出现a(数组名)【n】后面加数代表列的移动);
a+n指向a【n】,或者说a+n是a【n】的地址,当(a+n)时与a【n】等价(a+1=a【n】实际是将指针a向后移动了一行的元素乘以字节,如a的地址为2000,那么a+1是2000+3X4=2016,一行有三个元素,4为字节数);
在二位数组中,a+i、a【i】、(a+i)、&a【i】、&a【i】【0】的值相等,即都代表同一地址,但基类型不同。
**着重强调(a+0)存放的是a【0】所指向元素的地址,而a【0】本身就是所指向元素的地址a取出的是所指向元素的地址(a)才可取出元素的值**
若用一个指针变量pt来指向一维数组,应这样定义
int (pt)【4】;
表示pt指向由4个整型元素组成的一维数组。
接下来引入行列,a(二维数组名)指向行,为自身的地址,*a【1】指向列即所要取元素地址,当在加上&时指向列又指向了行。&a【0】与&a【i】等价。
`#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));
printf("%d,%d\n",a[0],(a+0));
printf("%d,%d\n",&a[0],&a[0][0]);
printf("%d,%d\n",a[1],a+1);
printf("%d,%d\n",&a[1][0],(a+1)+0);
printf("%d,%d\n",a[2],(a+2));
printf("%d,%d\n",a[1][0],((a+1)+0));
printf("%d,%d\n",a[2],((a+2)+0));
return 0;
}`
效果图辅助理解
补充:对于 int *(pt)[4],主要是对所代表的有4个元素的理解,还有基类型(所指向元素数据类型)。
int a【0】与int *(pt)[4]两者基类型不同,前者是整型,后者是一维数组,虽然地址都是(假设二维数组首行元素地址为2000)2000。主要是不要把两者划等号,互相替代。
还有就是对&a【0】的理解:这个取地址符,相当于将一维指针转化为二维指针,相当于另设一个指针变量p储存a【0】的地址。
对&a理解
`#include<stdio.h>
int main()
{
int a[4]={1,3,5,7};
int (p)[4];
p=&a;
printf("%d\n",(p)[3]);
}而非是p=a; p=a指的是a数组中的首元素,而p=&a是指p指向一维数组也就是行,二者基类型不一样。  知识点:用指向数组的指针作函数参数 用指针变量作形参来接受实参数组名传来的地址有两种方式①用指向变量的指针变量;②用指向一维数组的指针变量。简单解释就是,实参为二维,形参若想用指针的话就要用一维指针来接受,实参为一维指针,形参就用指向变量的指针变量。例如: 三个学生各学四门课,计算总平均分和第n个学生的全部成绩。
#include<stdio.h>
void average(float *p,int n)
{
float p_end;
float sum=0,i;
p_end=p+n-1;
for(;p<=p_end;p++)
sum=sum+(p);
i=sum/n;
printf("average=%5.2f\n",i);
}
void search(float (p)[4],int n)
{
int i;
for(i=0;i<4;i++)
printf("%5.2f",(*(p+n)+i));
}
int main()
{
float a[3][4]={{65,67,70,60},{85,87,89,83},{98,93,87,68}};
average(*a,12);
search(a,2);
return 0;
}`
这个函数主要亮点就是对形参实参的使用,要符合降级法和门当户对法(基类型要一样,如实参为二维数组首地址,那么它所代表的其实传到形参的是一维数组的地址)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理