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[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
元素所占的字节数。在指向行的指针前面加一个 *,就转换为指向列的指针。 例如,a
和 a+1
是指向行的指针,在它们前面加一个 * 就是 *a
和 *(a+1)
,它们就成为指向列的指针,分别指向a
数组0
行0
列的元素和1
行0
列的元素。反之,在指向列的指针前面加&
,就成为指向行的指针。例如 a[0] 是指向0
行0
列元素的指针,在它前面加一个&
,得&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语言指针基础知识点(六)--通过指针引用多维数组相关推荐
- C语言指针基础知识点(四)--通过指针引用数组
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- C语言指针基础知识点(七)--通过指针引用字符串
指针系列目录 C语言指针基础知识点(一)–指针及指针变量 C语言指针基础知识点(二)–指针变量的引用 C语言指针基础知识点(三)–指针变量作为函数参数 C语言指针基础知识点(四)–通过 ...
- c语言实验7字符串,C语言实验六(第七章二维数组字符串数组)
C语言实验六(第七章二维数组字符串数组) 第 1 页 共 7 页第七章二维数组.字符串数组题[书面作业] 以书面作业形式上交,2010 年 11 月 1 日课堂交三道题的源程序1. 编写一个主函数:用 ...
- C语言定义和引用二维数组
怎样定义和引用二维数组 二维数组常称为矩阵.把二维数组写成行(row)和列(column)的排列形式,可以有助于形象地理解二维数组的逻辑结构. 一.怎样定义二维数组 其基本概念与方法与一维数组相似,如 ...
- 【C语言】指针基础知识点汇总
指针(一) 基础 一 指针的概念 为了方便访问内存中的内容,给每个内存单元一个编号,我们称这个编号为地址,及为指针. 指针也是一种数据类型 所以指针都有自己的内存 存储的是地址(编号) 指针的四要素 ...
- 指针——基础知识点归纳总结
一.指针概述 指针是用来存放地址的变量: 指针的大小是固定的4个或8个,取决于你的操作系统(32位/64位): 指针的类型决定了指针的步长和访问权限: 指针的运算规则: 二.字符串指针 字符串的名称为 ...
- Python基础知识点六万字总结,爆肝一周熬夜完成【建议收藏】
大家好,我是辣条. 今天给大家带来Python基础知识点的总结,不夸张的说我一周才写完,这才是第一弹,如果大家喜欢记得三连呦,我会火速更新下一弹,争取把这个系列做完,希望得到大家的支持. 目录 注释 ...
- 【C语言进阶深度学习记录】三十 二维数组与二维指针
文章目录 1 二维指针(指向指针的指针) 2 二维数组 3 二维数组的类型 3.2 如何动态申请二维数组 4 总结 1 二维指针(指向指针的指针) 指针的本质是变量 指针的指针是保存指针变量的地址.如 ...
- C语言试题二十一之定义n×n的二维数组编写函数 function(int a[][n])功能是:使数组左下半三角元素中的值全部置成0。
1. 题目 定义了n×n的二维数组,并在主函数中自动赋值.请编写函数 function(int a[][n]),该函数的功能是:使数组左下半三角元素中的值全部置成0. 2 .温馨提示 C语言试题汇总里 ...
最新文章
- 打印机尚未链接到此计算机,win10系统无法连接打印机显示未指定设备的解决方法...
- 2017-2018-1 我爱学Java 第一周 作业
- 在利用计算机生成,计算机生成人像,从而使人脸的模糊变为现实
- 系统设计4:Web服务和流量限制
- linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料
- 01_appium自动化环境的搭建
- linux登陆提示鉴定故障_5个最常见的Linux问题的故障排除提示
- 教育技术c语言考研试题,C南京师范大学教育技术学考研真题 C语言与Web技术真题(2005--2008)...
- 继上海之后 美团买菜在北京推出测试服务站
- 数据类型的小小研究:Access与SQL Server的数据类型
- POJ 1398 Complete the sequence! ★ (差分)
- Unable to open log device '/dev/log/main' : No such file or directory it ...
- java 4级_《软件测试人员(Java)(4级)》【价格 目录 书评 正版】_中国图书网
- 一页纸项目管理及模板下载
- UG NX机床搭建仿真三四五轴CSE视频教程
- 教程,word导出为pdf既要书签和链接又要高清图片
- Postgresql - cursor介绍
- Android基于百度地图的拖拽定位(地图可以拖动,定位图标不动)
- Android实现渐色变圆形
- C# Winform控件库分享,免费开源,支持中文!(附DLL及教程)