博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(九十四)函数和二维数组
阅读量:7081 次
发布时间:2019-06-28

本文共 2152 字,大约阅读时间需要 7 分钟。

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

另外,本篇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
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] = 8a[0][1] = 2a[0][2] = 10a[0][3] = 0a[1][0] = 0a[1][1] = 8a[1][2] = 2a[1][3] = 10a[2][0] = 2a[2][1] = 0a[2][2] = 8a[2][3] = 0a[3][0] = 0a[3][1] = 10a[3][2] = 8a[3][3] = 10a[4][0] = 2a[4][1] = 2a[4][2] = 10a[4][3] = 8total = 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宽度,然后指针所在位置的值}

输出:

0027FCB40027FCC40027FCC40027FCC86

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

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

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

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

转载地址:http://ltjml.baihongyu.com/

你可能感兴趣的文章
LoadRunner在移动端性能测试的应用
查看>>
Hello JMX!
查看>>
轻松学习Linux之认识Shell
查看>>
Golang之interface
查看>>
SQL Server T-SQL高级查询
查看>>
Python自省(反射)指南[转]
查看>>
阿里巴巴公布了一份最新的AI成绩单
查看>>
Azure ARM (4) 开始创建ARM Resource Group并创建存储账户
查看>>
jQuery学习笔记开篇
查看>>
基于Xcode5的本地化
查看>>
【Linux高级驱动】linux设备驱动模型之平台设备驱动机制【转】
查看>>
Windows Embedded Standard开发初体验(一)
查看>>
与二进制有关的几道面试题
查看>>
这样的程序员创业有戏
查看>>
[翻译]ADO.NET Entity Framework Beta2(八)/快速入门(实体框架)(3)/生成学校实体数据模型...
查看>>
单机最大tcp连接数
查看>>
[转]LINQ是什么意思?
查看>>
计算阶乘n!
查看>>
条件表达式的短路求值与函数的延迟求值
查看>>
字符数组转换成数字
查看>>