数组指针、指针数组以及二位数组的深入解析
inti,j;
inta[2][3]={3,4,5,6,7,8};//
int*p[3]; //表示一个数组,数组中的元素是指针类型,一共有三个元素
int(*q)[3];//是一个指针,指向一个含有三个int型的数组(q+1)会跳三个数组元素
//把第一行三个元素地址存放在p指针数组中
for(i=0;i<3;++i)
p[i]=&a[0][i];
//输出指针数组中地址所对应值
for(j=0;j<3;++j)
cout<<*p[j]<<"";//输出结果为:3,4,5
cout<<endl;
q=a;//把数组a开始地址赋给指向一维数组q;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<*(*(q+i)+j)<<"";//输出数组中元素
system("pause");
参考《c++primer》
严格的将,c++中没有多维数组,通常所指的多维数组其实就是数组的数组,比如intarry[3][4];表示一个长度为3的数组,数组中的每个元素是一个长度为4的数组。在使用多维数组时,记住这一点有利于理解其应用。
下面来讲讲多维数组与指针的关系。与普通数组一样,使用多维数组时,实际上将其自动转换为指向该数组第一个元素的指针。也就是说,数组的名字是一个指向该数组中第一个元素的指针,在一维数组中,arry==&arry[0],这两个地址是一样的。在二维数组中,数组名称指向第一个元素,第一个元素是一个长度为4的数组。我们定义一个指向长度为4的数组的指针int(*p)[4],然后可以将二维数组的首地址赋值给它,p=arry。这样是可以进行赋值的。这里同样满足arry==&arry[0]。
知道了二维数组名字与指针的关系,那么我们在进行二维数组传参的时候就会好理解很多,以前二维数组传参是一直让人头疼的问题。这里我们还是将二维数组名字作为实参来传递,在接受函数的形参中,我们只需要定义一个指向具体长度为数组的指针即可,比如我们这里使用int(*p)[4]来接受arry这样的参数。下面给出代码实例。
#include<iostream>
#include<stdlib.h>
usingnamespacestd;
//数组名字是一个指向数组首元素的指针,这里我们定义一个指向数组的指针来接受arry
//r表示二位数组的行数,c表示二维数组的列数。
voidPrintArry(int(*arry)[4],intr,intc)
{
for(inti=0;i<r;i++)
{
for(intj=0;j<c;j++)
{
cout<<arry[i][j]<<"";
}
cout<<endl;
}
}
voidmain()
{
intarry[3][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13}};
PrintArry(arry,3,4);//等价于PrintArry(&arry[0],3,4);
system("pause");
}
上述一个简单的打印二维数组的简单例子,重点是二维数组的传参。
更优化的方法
在上述示例中,形参必须指明这个arry指针是指向一个长度为多少的数组,如int(*arry)[4]必须指明为4,有一定的局限性,那么有没有更好的方法呢。答案是有的。考虑到二维数组在内存中占据连续的空间这一个特性,我们可以用以为数组来表达二位数组。将上述PrintArry方法进行改写,改写结果如下:
#include<iostream>
#include<stdlib.h>
usingnamespacestd;
//传入数组的指针,二维数组的行数与列数
voidPrintArry2(int*arry,intr,intc)
{
for(inti=0;i<r*c;i++)
{
cout<<arry[i]<<"";
}
cout<<endl;
}
voidmain()
{
intarry[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
PrintArry2(&arry[0][0],4,4);//传入数组中的第一个数组中的第一个元素的地址
system("pause");
}
相关文章
- 数组拼接sql语句[通俗易懂]
- shell输出数组元素_shell中使用数组
- 【说站】js数组在头部或尾部插入元素的方法
- C/CPP数组的深入理解 | 指针与数组 | 一二三维数组
- 合并两个有序数组
- 前缀和 LeetCode 560.和为K的子数组
- C/CPP数组的深入理解 | 指针与数组 | 一二三维数组
- 【C 语言】数组 ( 指针数组用法 | 菜单选择 )
- 深入理解Oracle数组声明(oracle数组声明)
- 深入理解MongoDB中的数组操作技巧(mongodb数组操作)
- 深入解析:如何在MySQL中使用Byte数组进行数据存储与查询?(byte数组mysql)
- Oracle中的低数组使用细则(oracle低基数列)
- js获取数组任意个不重复的随机数组元素原创
- 数组和指针的区别深入剖析
- 深入线性时间复杂度求数组中第K大数的方法详解
- 深入理解c语言数组
- php数组操作之键名比较与差集、交集赋值的方法
- C语言安全编码数组记法的一致性
- JavaScript中的数组特性介绍
- 深入探密Javascript数组方法