900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > C语言指针基础知识点(六)--通过指针引用多维数组

C语言指针基础知识点(六)--通过指针引用多维数组

时间:2023-10-03 11:29:19

相关推荐

C语言指针基础知识点(六)--通过指针引用多维数组

指针系列目录

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 + 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");} }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。