先构造一个指针数组ptr,将原来的二维数组data的每行首地址赋给指针数组的每个成员。再用一个二级指针p指向指针数组,以后即可使用二级指针p来下标访问二维数组。
这样没问题,但假如二维数组的大小是一个动态变化的,也就是事先不知道数组的大小的话。本人就下面这样做:
指针数组ptr不能在代码中写死成员的个数,然后本人就用malloc动态分配一个空间(数组行数*sizeof(int*)),这样也相当于构造了一个指针数组ptr。然后再取行的首地址赋给ptr对应空间。最后二级指针p再指向ptr。但是为什么p[1]不是指向的数组第二行了?
解决方案
100
int *ptr = (int *)malloc(3 * sizeof(int *));应该是int **ptr = (int **)malloc(3 * sizeof(int *));
p = (int **)&ptr;应该是p = (int **)ptr;
p = (int **)&ptr;应该是p = (int **)ptr;
#include<stdio.h> #include<stdlib.h> void main() { int data[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; int i, j; int **p; //int *ptr[3] = { data[0], data[1], data[2] }; int **ptr = (int **)malloc(3 * sizeof(int *)); for (i = 0; i < 3; i++) { *(ptr + i) = data[i]; } p = (int **)ptr; printf("%p %p %p\n", p[0], p[1], p[2]); }
40
仅供参考:
#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) { int **p,i; p=(int **)malloc(rows*sizeof(int *)); if (NULL==p) exit(1); for (i=0;i<rows;i++) { p[i]=(int *)malloc(cols*sizeof(int)); if (NULL==p[i]) exit(1); } return p; } void deletearr2d(int **p,int rows) { int i; for (i=0;i<rows;i++) { free(p[i]); } free(p); } int main() { int **arr2d,i,j,r,c; r=4; c=5; //在堆中开辟一个4×5的二维int数组 arr2d=newarr2d(r,c); for (i=0;i<r;i++) { for (j=0;j<c;j++) { arr2d[i][j]=i*c+j; } } for (i=0;i<r;i++) { for (j=0;j<c;j++) { printf(" %2d",arr2d[i][j]); } printf("\n"); } deletearr2d(arr2d,r); r=6; c=3; //在堆中开辟一个6×3的二维int数组 arr2d=newarr2d(r,c); for (i=0;i<r;i++) { for (j=0;j<c;j++) { arr2d[i][j]=i*c+j; } } for (i=0;i<r;i++) { for (j=0;j<c;j++) { printf(" %2d",arr2d[i][j]); } printf("\n"); } deletearr2d(arr2d,r); return 0; } // 0 1 2 3 4 // 5 6 7 8 9 // 10 11 12 13 14 // 15 16 17 18 19 // 0 1 2 // 3 4 5 // 6 7 8 // 9 10 11 // 12 13 14 // 15 16 17 //
20