【c语言学习笔记】指针数组和数组指针以及在做题的时候遇到的问题
程序员文章站
2024-02-15 14:53:58
...
第一次笔记:题目是【找出方阵每列中的最小元素及其所在的行号】,实际上是我对指针数组和数组指针理解不透彻导致访问并交换了错误的内存地址。
【指针数组】
1. 定义
int *p[M] ,arry[M][N];
2. 初始化
//可以通过循环来给指针数组初始化
int i,j;
for(i=0;i<M;i++)
{
p[i]=arry[i];
}
3. 含义
指针数组,顾名思义,他是一个数组,根据运算符的优先级顺序,*p[M] ,[ ]的优先级大于 * ,p首先和[M]结合,再与*结合,表示这个数组是指针类型,每一个元素都是一个指针,指针数组存储的就是二维数组的每一行的首地址(虽然是线性存储但这么说易于理解),数组下标为二维数组第一个下标。
指针数组p[M]和二维数组arry[M][N]的关系图如下:
【数组指针】
1. 定义
int a[M][N],(*p)[N];
2. 初始化
//在指针数组中可以直接通过数组名来给指针数组初始化
p = a;
3. 含义
指针数组通过圆括号,使得 * 首先与p结合,说明p是指针变量,然后再与 [N] 结合,说明指针变量p的基类型是包含N个元素的数组。数组指针,指的是数组名的指针,即指向数组的首地址的指针,指针要移动,必须要知道当前所指内容的大小,才能确定移动多少距离,移动的步长就是其指向的内容的字节数,所以,【N】指的是跨越的步长。
在指针数组中,p和a的基类型相同,因此p+1等价于a+1等价于a[1]。
附(一道简单的指针题目):
//找出方阵每列中的最小元素及其所在的行号
#include"stdio.h"
#include"stdlib.h"
#define M 5
#define N 6
void getrand(int (*p)[]);//给数组获取随机数字
void findmin(int (*p)[],int a[],int []);//找出每列最小元素和行号
void outdata(int (*p)[],int a[],int []);//输出矩阵和每列最小元素以及行号
int main()
{
int arryOne[M][N],arryTwo[N],h[N];
getrand(arryOne);
findmin(arryOne,arryTwo,h);
outdata(arryOne,arryTwo,h);
return 0;
}
void getrand(int (*p)[N])
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
p[i][j]=rand()%50;
}
}
}
void findmin(int (*p)[N],int a[N],int h[N])
{
int i,j,min;
for(i=0;i<N;i++)
{
min=p[i][0];
for(j=0;j<M;j++)
{
if(min>p[j][i])
{
min=p[j][i];
h[i]=j;
}
}
a[i]=min;
}
}
void outdata(int (*p)[N],int a[N],int h[N])
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("%5d",p[i][j]);
}
printf("\n");
}
for(i=0;i<N;i++)
{
printf("第%d列最小值是%d位于第%d行\n",i,a[i],h[i]);
}
}
注意: 在for循环查找列最小的时候,不要忘记两层循环的范围不一致,因此N在外层,M在内层,次错误会导致交换范围外的不确定的值。