(九十四)函数和二维数组
来源:互联网 发布:刮眉毛会变浓吗 知乎 编辑:程序博客网 时间:2024/05/17 09:23
这两天见同学,四处跑,倒没太多空来安心学习,昨天到了三亚才能安心继续学习。
另外,本篇94是之前写的;
95涉及到字符串、地址、 指针等,比较复杂,所以花了好些时间来整理思路,总算搞明白了;
96今天刚刚完成的内容;
于是一起发出来,我再继续学函数和string对象。
————————————分割线————————————
二维数组的标准格式是:数组名[行数][列数]
在函数和指针的时候,我们将数组作为参数传递给函数的时候,是这样的:
void abc(int*变量名, 数组成员数);
也可以这样做:
void abc(int 变量名[], 数组成员数);
也就是说,在函数头和函数原型中,int *a和int a[]是一样的——即*a和a[]是相似的(也许?)。
在传递二维数组的时候,函数头和函数原型中是这么写的,例如:
void abc (int a[][4],5);
这表示传递一个二维数组,a是指针,指针宽度是4个int。
这样的话,就相当于指出了二维数组的列数,而没有指明行数。
又因为上一篇的内容,所以实质上和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]),和参数5int 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*4个int;
*a是一维数组的指针,坐标是a[0][0],长度是4个int;
**a是数组中的一个成员的地址,坐标是a[0][0],长度是1个int。
②在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次引用之后,则是值。
不解除引用的时候,是二维数组中的一个成员,又因为每个成员里有4个int值,所以是4个int宽度;
解除一次引用时,因为是二维数组一个成员中的四个成员 中的一个成员,是int类型的值,所以是1个int宽度。
- (九十四)函数和二维数组
- 函数和二维数组
- 函数和二维数组
- 二维数组指针和函数参数
- 二维数组指针和函数参数
- 【补习】二维数组,指针和函数
- 数组、二维数组、函数
- 二维数组和二维指针 作函数参数
- C++数组(二维数组)与指针 以及 函数传递/返回指针和数组参数
- 第十章 数组和指针(函数和二维数组,本章个人总结)总结 140520
- C++学习笔记(三)--函数参数,数组函数,指针和const,二维数组函数,递归,函数指针
- 静态二维数组和动态二维数组(C语言)
- 关于用二维数组调用函数的寻址(多维数组和指针)
- C#动态分配一维数组和二维数组函数
- 二维数组排序函数
- 函数传递二维数组
- 二维数组 函数传递
- 函数返回二维数组
- 用hibernate+注解实现各种关系映射
- android notification总结
- 关于多维数组一点的小技巧
- 2015-12-22
- Objective-C中的属性和实例变量
- (九十四)函数和二维数组
- 实验1 线性表的顺序实现
- IP数据包格式
- 2015年的倒数第10天新的一年就要开始了,加油,努力!
- system调用
- git 常用操作一览图
- 详细讲解Java反射机制
- 多态与虚函数编程题 #2(C++程序设计第6周)
- OpenCV中的Haar+Adaboost(二):积分图和45°旋转积分图