二维数组的若干问题
来源:互联网 发布:vr图片软件 编辑:程序博客网 时间:2024/05/17 04:14
二维数组与指针
1、如何建立二维数组?
栈:
int a[M][N] = {0};
堆:
new int[M][N];
malloc(M * N * sizeof(int));
2、如何用指针指向二维数组?
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};
虽然a[0]、a都是数组首地址,但二者指向的对象不同:①a[0]是一维数组的名字,它指向的是a[0]数组的首元素a[0][0],对其进行"*"运算(*a[0])得到的是一个数组元素值a[0][0]。可以用*(a[i]+j)表示该二维数组第i行、第j列的元素a[i][j]。②a是二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的移动单位是行,所以a+i指向的是第i个行数组,即指向a[i]。对a进行"*"运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。可以用*(*(a+i)+j)表示该二维数组第i行、第j列的元素a[i][j],当i=0,j=0时,**a即为a[0][0]。
如何用一个指针p指向该二维数组呢?有int(*p)[N]、int* p、int** p三种方式。
int(*p)[N] =a;//如果是动态申请的数组,则为int(*p)[N] = new int[M][N];这里的p与a[M][N]中的a等价
int* p = a[0];//如果是动态申请的数组,则为int* p = *(new int[M][N]);或者int* p = (int*)(new int[M][N]);
int** p = (int**)a;//如果是动态申请的数组,则为int* p = (int**)(new int[M][N]);
3、如何引用二维数组元素?
二维数组与函数参数
1、二维数组如何做形参?
C语言中没有引用,可以用如下三种方式:
void func(int a[M][N]);//a为二维数组首行元素的地址
void func(int a[][N]);//a为二维数组首行元素的地址
void func(int (*p)[N]);//p为指向二维数组首行元素的指针
①一维数组做形参为void func(int a[]),不用指定数组大小,因为这里形参虽然是数组形式,但编译时是将a按指针变量处理的,相当于void func(int *a)。在函数被调用时,系统会建立一个指针变量a,用来存放从主调函数传递过来的实参数组首元素的地址。
②同理,二维数组做形参时,void func(int a[][N]),在函数被调用时,系统会建立一个指针变量a,用来存放从主调函数传递过来的实参二维数组首行元素(含N个元素)的地址。
③数组名作形参时,传递的是指针,因此对数组元素的操作会改变实参的值。
二维数组与引用
1、C++中是否能建立数组的引用?
- 二维数组的若干问题
- 关于C/C++中二维数组、指针的引用等若干问题的总结
- 有关字符数组的若干问题
- 将List转化为数组的若干问题
- 二维数组的用法
- 二维数组的传递
- 二维数组的排序
- 二维数组的排序
- 二维数组的应用
- 二维数组的地址
- 二维数组的运用
- 二维数组的指针
- 二维数组的排序
- 二维数组的初始化
- 二维数组的初始化
- 二维数组的动态分配
- 二维数组的输出
- js的二维数组
- 定时器用法
- MYSQL用户权限管理(Grant,Revoke)
- yii启动执行核心流程详解
- 每日一练------9*9口诀(多层循环)
- sicp 4.1.1-4.1.2
- 二维数组的若干问题
- IOS 学习笔记12 设备旋转
- 【转】U-BOOT支持烧写yaffs2文件系统
- SQL-分页存储过程
- [易语言]连接MSSQLSERVER数据库学习
- suse linux 启动oralce服务及oralce实例
- POJ 1002. RE和TLE
- myeclipse下手动配置多个tomcat实例
- 虚拟机安装OS X升级方法和黑苹果安装网站