指针系列目录

  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), *a0行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 元素所占的字节数。在指向行的指针前面加一个 *,就转换为指向列的指针。 例如,aa+1 是指向行的指针,在它们前面加一个 * 就是 *a*(a+1),它们就成为指向列的指针,分别指向a数组00列的元素和10列的元素。反之,在指向列的指针前面加&,就成为指向行的指针。例如 a[0] 是指向00列元素的指针,在它前面加一个&,得&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");
         } 
     }
}  

在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐