当前位置: 首页 > news >正文

(九十四)函数和二维数组

这两天见同学,四处跑,倒没太多空来安心学习,昨天到了三亚才能安心继续学习。

另外,本篇94是之前写的;

95涉及到字符串、地址、 指针等,比较复杂,所以花了好些时间来整理思路,总算搞明白了;

96今天刚刚完成的内容;

于是一起发出来,我再继续学函数和string对象。

————————————分割线————————————


二维数组的标准格式是:数组名[行数][列数]

在函数和指针的时候,我们将数组作为参数传递给函数的时候,是这样的:

void abc(int*变量名数组成员数);

也可以这样做:

void abc(int 变量名[], 数组成员数);

也就是说,在函数头和函数原型中,int *a和int a[]是一样的——*aa[]是相似的(也许?)

 

在传递二维数组的时候,函数头和函数原型中是这么写的,例如:

void abc (int a[][4],5);

这表示传递一个二维数组,a是指针,指针宽度是4int

这样的话,就相当于指出了二维数组的列数,而没有指明行数。

 

又因为上一篇的内容,所以实质上和void abc (int(*a)[4], 5); 这样的是等价的。但是,上面的a[][4]更直观一些。

 

如代码:

#include<iostream>
using namespace std;

//int sum(int a[][4], int);	//这个更直观,是(由4个元素组成的int数组)的地址
int sum(int(*a)[4], int);	//这个和上面的是等价的,就像(int *a)和(int a[])是等价的一样
void give(int a[][4], int);	//

int main()
{
	int a[5][4];	//声明二维数组
	give(a, 5);	//调用give函数,参数指针a(地址是a[0][0]),和参数5
	int total = sum(a, 5);
	cout << "total = " << total << endl;
	system("pause");
	return 0;
}


void give(int a[][4], int m)
{
	for (int i = 0;i < m;i++)	//循环行数
	{
		int n;
		for (n = 0;n < 4;n++)	//循环列数
		{
			a[i][n] = rand() & 10;	//赋值
			cout << "a[" << i << "][" << n << "] = " << a[i][n] << endl;
		}	
	}
}

int sum(int(*a)[4], int m)
{
	int total = 0;
	for (int i = 0;i < m;i++)	//循环行数
	{
		int n;
		for (n = 0;n < 4;n++)	//循环列数
		{
			total = total + a[i][n];	//相加
		}
	}
	return total;
}

输出:


a[0][0] = 8
a[0][1] = 2
a[0][2] = 10
a[0][3] = 0
a[1][0] = 0
a[1][1] = 8
a[1][2] = 2
a[1][3] = 10
a[2][0] = 2
a[2][1] = 0
a[2][2] = 8
a[2][3] = 0
a[3][0] = 0
a[3][1] = 10
a[3][2] = 8
a[3][3] = 10
a[4][0] = 2
a[4][1] = 2
a[4][2] = 10
a[4][3] = 8
total = 100
请按任意键继续. . .

解释:

①注意,对二维数组解除一次引用之后,是一维数组。例如int a[3][4]

其中a是二维数组的指针,坐标是a[0][0],长度是3*4int

*a是一维数组的指针,坐标是a[0][0],长度是4int

**a是数组中的一个成员的地址,坐标是a[0][0],长度是1int

 

②在give这个函数内部:

如节选代码:

void move(int a[][4], int m)
{
	cout << a << endl;	//指针,4个int宽度
	cout << a+1 << endl;	//指针偏移4个int宽度,4个int宽度
	cout << *(a + 1) << endl;	//指针偏移4个int宽度,1个int宽度
	cout << *(a + 1)+1 << endl;	//指针偏移4个int宽度,再偏移一个宽度,1个int宽度
	cout << *(*(a + 1) + 1) << endl;	//指针偏移4个int宽度,再偏移1个int宽度,然后指针所在位置的值
}

输出:


0027FCB4
0027FCC4
0027FCC4
0027FCC8
6

int宽度的(无论是一个还是四个),那么说明是地址,只是表示的宽度不同;

解除2次引用之后,则是值。

不解除引用的时候,是二维数组中的一个成员,又因为每个成员里有4int值,所以是4int宽度;

解除一次引用时,因为是二维数组一个成员中的四个成员 中的一个成员,是int类型的值,所以是1int宽度。


相关文章:

  • Scribe配置文件解析
  • 读取文件操作
  • InfluxDb系列:几个关键概念(主要是和关系数据库做对比)
  • hibernate 配置connection.autocommit
  • 使用hexo搭建个人博客
  • Android ListView监听上下滑动(判断是否显示返回顶部按钮)
  • django返回json的几种方法以及android调用
  • Lind.DDD.ExpressionExtensions动态构建表达式树,实现对数据集的权限控制
  • 在Visual Studio中用C++语言创建DLL动态链接库图文教程
  • 2015.12.30 日学习总结
  • 谈模块独立拆分上线一些经验
  • SpringMVC multipart文件上传
  • apache开源项目--ibatis
  • 快播活该被抓,跟公诉人是谁无关
  • 一则简单演示样例看Oracle的“无私”健壮性
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • axios 和 cookie 的那些事
  • gulp 教程
  • Java 最常见的 200+ 面试题:面试必备
  • jQuery(一)
  • Laravel 中的一个后期静态绑定
  • Python十分钟制作属于你自己的个性logo
  • React中的“虫洞”——Context
  • tab.js分享及浏览器兼容性问题汇总
  • Vue实战(四)登录/注册页的实现
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 电商搜索引擎的架构设计和性能优化
  • 后端_MYSQL
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据科学 第 3 章 11 字符串处理
  • 微服务入门【系列视频课程】
  • 一个完整Java Web项目背后的密码
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • #100天计划# 2013年9月29日
  • #ifdef 的技巧用法
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • #QT(串口助手-界面)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (四) 虚拟摄像头vivi体验
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)为什么要选择C++
  • (转)【Hibernate总结系列】使用举例
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)JAVA中的堆栈
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Family_物联网
  • .htaccess配置常用技巧
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net 微服务 服务保护 自动重试 Polly