C语言指针操作(三)*通过指针引用多维数组

在这里插入图片描述

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 

学习日记

目录

学习日记

前言​编辑

 一、多维数组元素的地址

二、指向数组元素的指针变量

三、指向由m个元素组成的一维数组的指针变量 

四、用指向数组的指针作函数参数 

 C语言指针操作


前言

        指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。 

 一、多维数组元素的地址

表示形式

含义

地址

a

二维数组名,指向一维数组a[0],即0行起始地址

2000

a[0], *(a+0), *a

00列元素地址

2000

a+1, &a[1]

指向第1行起始地址

2016

a[1], *(a+1)

10列元素a[1][0]的地址

2016

a[1]+2, *(a+1)+2, &a[1][2]

12列元素a[1][2]的地址

2024

*(a[1]+2), *(*(a+1)+2), a[1][2]

12列元素a[1][2]的值

是元素值,为13

        C语言的地址信息中既包含位置信息(如内存编号2000),还包含它所指向的数据的类型信息。 a[0]是一维数组名,它是一维数组中起始元素的地址,a是二维数组名,它是二维数组的首行起始地址,二者的纯地址是相同的,即2000,但它们的基类型不同,即它们指向的数据的类型不同,前者是整型数据,后者是一维数组。

int (*pt)[4];
//表示pt指向由4个整型元素组成的一维数组,此时指针变量pt的基类型是由4个整型元素组成的一维数组

        输出二维数组的有关数据(地址和元素的值)。

#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[0],&a[0][0]);		//0行起始地址和0行0列元素地址
	printf("%d,%d\n",a[1],a+1);			//1行0列元素地址和1行起始地址
	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[2],a+2);			//2行起始地址
	printf("%d,%d\n",a[1][0],*(*(a+1)+0));	//1行0列元素的值
	printf("%d,%d\n",*a[2],*(*(a+2)+0));	//2行0列元素的值
	return 0;
}

二、指向数组元素的指针变量

        有一个3×4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。

#include <stdio.h>
int main()
{	int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
	int *p;							//p是int *型指针变量
	for(p=a[0];p<a[0]+12;p++)			//使p依次指向下一个元素
	{	if((p-a[0])%4==0) printf("\n");	//p移动4次后换行
		printf("%4d",*p);				//输出p指向的元素的值 
	}
	printf("\n");
	return 0;
}

        p是一个int *型(指向整型数据)的指针变量,它可以指向一般的整型变量,也可以指向整型的数组元素。每次使p值加1,使p指向下一元素。

三、指向由m个元素组成的一维数组的指针变量 

        输出二维数组任一行任一列元素的值。

#include <stdio.h>
int main()
{	int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};		//定义二维数组a并初始化
	int (*p)[4],i,j;			//指针变量p指向包含4个整型元素的一维数组
	p=a;					//p指向二维数组的0行
	printf("please enter row and colum:");
	scanf("%d,%d",&i,&j);	//输入要求输出的元素的行列号
	printf("a[%d,%d]=%d\n",i,j,*(*(p+i)+j));			//输出a[i][j]的值
	return 0;
}

 int a[4];

(a有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)
//p是指向具有4个元素的一维数组的指针
{	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");
}

        实参与形参如果是指针类型,应当注意它们的基类型必须一致。不应把int *型的指针(即数组元素的地址)传给int (*)[4] 型(指向一维数组)的指针变量,反之亦然。

 C语言指针操作

C语言指针操作(一)指针变量

C语言指针操作(二)通过指针引用数组

C语言指针操作(三)*通过指针引用多维数组 

C语言指针操作(四)通过指针引用字符串

C语言指针操作(五)*指向函数的指针

C语言指针操作(六)*返回指针值的函数 

C语言指针操作(七)*指针数组和多重指针 

C语言指针操作(八)*动态内存分配与指向它的指针变量

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉蕤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值