二级指针问题
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