二维数组如何用指针表示

int b[2][5]
用下标方法表示如下
int b[i][j]
假设i = 0; j = 0,1,2,3,4;
用指针方法表示
* (* (b+i)+j) 演变 * (b[i]+j) 演变 (* (b+i) ) [j]
//为什么要加2个*号, 请懂的朋友解释下

二维数组用指针表示有两种方式:

一、动态数组方式。 

完全由动态数据构成二维数组。如M行N列的数组,先分配M个一维指针空间,然后在每个一维指针上分配N个元素的空间,即成为动态二维数组。

和普通数组不同,这种动态二维数组的各行之间地址并不连续。

参考代码:

#include<stdlib.h>
int **create(int m, int n)//创建m行n列的二维数组。
{
    int **r;
    int i;
    r=(int **)malloc(sizeof(int *) *m);//分配m个int*指针内存。
    for(i = 0; i < m; i ++)//遍历每行
        r[i] = (int *)malloc(sizeof(int)*n);//每行分配n个int型元素。
    return r;//返回地址值。
}

二、通过数组指针指向已有二维数组。

对于已经定义好的M行N列数组,可以使用指向N个元素的数组指针,指向该数组并访问。 

参考代码:

int a[10][5];
int (*p)[5];//每行5个元素的数组指针。
p=a;//把p指向a。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-29
二维数组可以看成是指针的指针,b[][] = **b;
比如b[2][5];
它是一个2行5列的二维数组,也可以看成是二级指针,一级存放的是行指针,然后每个行指针里面其实又是指向了5个列元素。
*(*(b+i)+j),*(b+i)是先取行指针,然后+j偏移到所要的列,然后*取值就得到i行j列的数据了。本回答被提问者和网友采纳
第2个回答  2012-07-29
是这样的,
int b[2][3]={1,2,3,4,5,6};这里假设i=1;
b+1代表移到下一行,但他的类型是(*p)[3](这个你通过把b+1赋值给*p[3],再试一下赋给*p就知道了);第一个星号后代表他指向刚刚移到的那行的第一个元素地址,再+j就是横向移到j列得到b[1][j]的地址,最后一个星号是取他的值.这是我的分析. //如果你不加里面那个星号,就是(b+i)+j,他只会继续向下(行)移动,而不会往列的方向移动的.
第3个回答  2012-07-29
* (* (b+i)+j) 中,
* (b+i)是这个数组的行地址,
(* (b+i)+j) 是这个数组的列地址,
整个* (* (b+i)+j)才代表b[i][j]上的内容!

* (b[i]+j) 中,
b[i]就等同于*(b+i),
同理(* (b+i) ) [j]就等同于b[i][j],

不知明白否?
第4个回答  2012-07-29
二维数组实质是数组的数组
相似回答