首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

二级指针有关问题

2013-07-08 
二级指针问题struct image{struct header *infounsigned char **data}typedef struct image * IMAGEIM

二级指针问题
struct image
{
struct header *info;
unsigned char **data;
};
typedef struct image * IMAGE;
IMAGE x;
------------------------------
int k=x->data[i][j];//双重循环里面有这么一句,我对x->data[i][j]的理解是建立在二级指针可以指向一个二维数组的基础上。x->data[i]取行地址,x->data[i][j]确定值,感觉不太正确。求指导。 二维数组 二级指针
[解决办法]
准确地说,指针的指针并不是指向二维数组,而是指向二级数组。也就是说,data本身是一个代表着数组的指针,数组的每个元素都是一个代表数组的指针。

它与二维数组的区别在于,二维数组中的所有元素都是连续存储的,我一次性为它分配好内存:


typedef char array_256[256];
typedef array_256 * ary_x_256;
ary_x_256 data = (ary_x_256 * )malloc( sizeof(array_256) * row_count );


而二级数组需要先为data分配空间,然后用循环为每个data[i]分配空间。

上面的二维数组定义下,data[i][j]相当于*((char*)data + i * 256 + j),计算好地址后一次间接访问。
如果是char**类型的data,则是:*(*(data+i)+j),是两次间接访问。
[解决办法]
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {


        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19

热点排行