数组指针、指针数组以及二位数组的深入解析_C 语言

int *p[3]与int (*p)[3]的区别
*p[3]这个是一个指针数组,它所代表的意思是数组中的每一个元素都是一个指针变量,而(*p)[3],p是一个指针变量,表示指向一个含有3个整型元素的一维数组。

复制代码 代码如下:

int i,j;
    int a[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++中没有多维数组,通常所指的多维数组其实就是数组的数组,比如int arry[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>
using namespace std;

//数组名字是一个指向数组首元素的指针,这里我们定义一个指向数组的指针来接受arry
//r表示二位数组的行数,c表示二维数组的列数。
void PrintArry(int (*arry)[4],int r,int c)
{
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            cout<<arry[i][j]<<" ";
        }
        cout<<endl;
    }
}

void main()
{
    int arry[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>
using namespace std;

//传入数组的指针,二维数组的行数与列数
void PrintArry2(int *arry,int r,int c)
{
    for(int i=0;i<r*c;i++)
    {
        cout<<arry[i]<<" ";
    }
    cout<<endl;
}

void main()
{
    int arry[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");
}

时间: 2024-11-08 18:18:11

数组指针、指针数组以及二位数组的深入解析_C 语言的相关文章

一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组?

问题描述 一个现成的二维数组,如何定义一个 指针的指针 来指向这个二维数组? 例:这样一个数组,想定义一个指针的指针,指向它. int arr1[4][4] ={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; ps. 这个指针的指针 是 用来传递个函数的. 因为某种要求,需要向函数传递一个二维数组,函数的形参表中定义了 int **. 因此 这个指针的指针一定要能够传递函数,并且函数能够通过它操作二维数组元素. 解决方案 指向二维数组的

java-关于Java二位数组行列互换问题

问题描述 关于Java二位数组行列互换问题 刚开始学Java,不太懂,这个为什么报错呢? 解决方案 行列下标搞错了,结果数组越界,仔细检查下就能看出来. 解决方案二: 笔误了吧 swap中i<arr[i].length改成j<arr[i].length

java二维数组问题-学习java二位数组遇到的问题

问题描述 学习java二位数组遇到的问题 public class TestSplit { public static void main(String[] args){ String s="1,2;3,4;5,6,7"; String[] s1=s.split(";"); double[][] d=new double[s1.length][];//第一维的长度赋值 for(int i=0;i<s1.length;i++){ String[] s2=s1[i

js中一维数组和二位数组中的几个问题示例说明_基础知识

js中的数组,可以存放各种数据类型(数值,字串) js中的数组没有越界,当输出的数组下标越界了,会显示undefined. js中的数组是默认动态增长的 遍历数组的一种简单方式. for(var key in arr){ window.alert(key+"= "+arr[key]); } 在给一个空的二维数组赋值的时候出现的问题: var arr2=[]; arr2[1][1]=45;//js不支持这种赋值方法 解决方法: //在这之前需要初始化定义arr2有多少行. for(var

c语言-C语言二位数组初始化的问题

问题描述 C语言二位数组初始化的问题 我这有一本书上的解释里面int b[][4]={{0,0,3},{},{0,10}};是正确的,但是习题里面这个int b[][3]={{1,2,3},{},{4,5}};就是错误的:在vc6.0里面输入是前面的是错的,后面的是对的,我想确定下到底哪个是对的.初始化的时候花括号中可以社么都不写吗?谢谢了! 解决方案 可能是编译器的问题吧,在vs2010中以上两种赋值都是正确的. 初始化的时候花括号中什么都不写 例如: int b[][4] = {}; //也

php二位数组获取重复元素

问题描述 php二位数组获取重复元素 $arr = array( array('0001','0002'), array('0001','0002','0003'), array('0001','0002','0003','0005'), array('0001','0002','1003','0005'), ); 希望得到结果,获取重复元素 $arr = array('0001','0002'); 解决方案 php获取数组中重复数据php 获取数组中重复数据 解决方案二: 最新版本ke没有问题

C++ 在堆上开辟与释放二维、三维指针详细解析_C 语言

学习C++新手通常会对指针的使用比较头疼,其实指针的概念很简单,只要能悟清楚这样一个简单的道理就能对指针有一定的认识了: 例如 int *a = new int[10]; 一维指针其实就相当于一维数组,不用去看书上所说的数组在内存中的首地址这些晦涩的话,以此类推 二维指针就相当于二维数组,新手对一维数组的开辟与释放比较容易熟悉,例如上面的a 释放就是 delete []a; a = NULL; 注意a = NULL; 必须要加上,这样是为了避免这个指针会变成"野指针".写程序时一定要注

C语言安全之数组长度与指针实例解析_C 语言

1.C语言编码需要保证变长数组的长度参数位于合法范围之内 例如以下代码: void func(size_t s) { int vla[s]; /*...*/ } /*...*/ func(size); /*...*/ 解决方案如下: enum {MAX_ARRAY = 1024}; void func(size_t s) { if(s < MAX_ARRAY && s != 0) { int vla[s]; /*...*/ } else { //错误处理 } } /*...*/ fu

二维数组 引用-Java中的二维数组的引用问题

问题描述 Java中的二维数组的引用问题 代码: public static void main(String args[]){ double[][] a={{1,2,3},{4,5,6},{7,8,9}}; System.out.println(a+" "+a[0]); } 结果: [[D@15db9742 [D@6d06d69c 疑惑:二维数组名a的引用和a[0]的引用有什么不同? 解决方案 您好,a是一个二维数组,a的引用就是整个二维数据对象,a[0]则是二维数组中的第一个对象{