指针系列目录

  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), *a 0行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");} }
}  

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

  1. C语言指针基础知识点(四)--通过指针引用数组

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  2. C语言指针基础知识点(七)--通过指针引用字符串

    指针系列目录   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过 ...

  3. c语言实验7字符串,C语言实验六(第七章二维数组字符串数组)

    C语言实验六(第七章二维数组字符串数组) 第 1 页 共 7 页第七章二维数组.字符串数组题[书面作业] 以书面作业形式上交,2010 年 11 月 1 日课堂交三道题的源程序1. 编写一个主函数:用 ...

  4. C语言定义和引用二维数组

    怎样定义和引用二维数组 二维数组常称为矩阵.把二维数组写成行(row)和列(column)的排列形式,可以有助于形象地理解二维数组的逻辑结构. 一.怎样定义二维数组 其基本概念与方法与一维数组相似,如 ...

  5. 【C语言】指针基础知识点汇总

    指针(一) 基础 一 指针的概念 为了方便访问内存中的内容,给每个内存单元一个编号,我们称这个编号为地址,及为指针. 指针也是一种数据类型 所以指针都有自己的内存 存储的是地址(编号) 指针的四要素 ...

  6. 指针——基础知识点归纳总结

    一.指针概述 指针是用来存放地址的变量: 指针的大小是固定的4个或8个,取决于你的操作系统(32位/64位): 指针的类型决定了指针的步长和访问权限: 指针的运算规则: 二.字符串指针 字符串的名称为 ...

  7. Python基础知识点六万字总结,爆肝一周熬夜完成【建议收藏】

    大家好,我是辣条. 今天给大家带来Python基础知识点的总结,不夸张的说我一周才写完,这才是第一弹,如果大家喜欢记得三连呦,我会火速更新下一弹,争取把这个系列做完,希望得到大家的支持. 目录 注释 ...

  8. 【C语言进阶深度学习记录】三十 二维数组与二维指针

    文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...

  9. C语言试题二十一之定义n×n的二维数组编写函数 function(int a[][n])功能是:使数组左下半三角元素中的值全部置成0。

    1. 题目 定义了n×n的二维数组,并在主函数中自动赋值.请编写函数 function(int a[][n]),该函数的功能是:使数组左下半三角元素中的值全部置成0. 2 .温馨提示 C语言试题汇总里 ...

最新文章

  1. 打印机尚未链接到此计算机,win10系统无法连接打印机显示未指定设备的解决方法...
  2. 2017-2018-1 我爱学Java 第一周 作业
  3. 在利用计算机生成,计算机生成人像,从而使人脸的模糊变为现实
  4. 系统设计4:Web服务和流量限制
  5. linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料
  6. 01_appium自动化环境的搭建
  7. linux登陆提示鉴定故障_5个最常见的Linux问题的故障排除提示
  8. 教育技术c语言考研试题,C南京师范大学教育技术学考研真题 C语言与Web技术真题(2005--2008)...
  9. 继上海之后 美团买菜在北京推出测试服务站
  10. 数据类型的小小研究:Access与SQL Server的数据类型
  11. POJ 1398 Complete the sequence! ★ (差分)
  12. Unable to open log device '/dev/log/main' : No such file or directory it ...
  13. java 4级_《软件测试人员(Java)(4级)》【价格 目录 书评 正版】_中国图书网
  14. 一页纸项目管理及模板下载
  15. UG NX机床搭建仿真三四五轴CSE视频教程
  16. 教程,word导出为pdf既要书签和链接又要高清图片
  17. Postgresql - cursor介绍
  18. Android基于百度地图的拖拽定位(地图可以拖动,定位图标不动)
  19. Android实现渐色变圆形
  20. C# Winform控件库分享,免费开源,支持中文!(附DLL及教程)

热门文章

  1. 如何批量注册推特账号
  2. for与if的基本用法
  3. 中效过滤器过滤等级与标准
  4. 闪存驱动器_“空”和新格式化的闪存驱动器上如何有可用空间?
  5. 三菱plcascll转换16进制_S7-200PLC ASCII码与十六进制数之间的转换指令及其使用
  6. 9.线型(Linetype)
  7. 设计模式十二之组合模式
  8. 微信小程序-并排放置
  9. android下赚钱的几个方式,flutter下拉列表
  10. struct.pack()