先构造一个指针数组ptr,将原来的二维数组data的每行首地址赋给指针数组的每个成员。再用一个二级指针p指向指针数组,以后即可使用二级指针p来下标访问二维数组。
这样没问题,但如果二维数组的大小是一个动态变化的,也就是事先不知道数组的大小的话。我就下面这样做:
指针数组ptr不能在代码中写死成员的个数,然后我就用malloc动态分配一个空间(数组行数*sizeof(int*)),这样也相当于构造了一个指针数组ptr。然后再取行的首地址赋给ptr对应空间。最后二级指针p再指向ptr。但是为什么p[1]不是指向的数组第二行了?
5 个解决方案
#1
弄清楚地址和值,弄清你代码中的每个变量的值和地址
#2
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]);
}
#3
仅供参考:
#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
//
#4
动态分配二维数组不像你这种写
参看:
http://blog.chinaunix.net/uid-22516719-id-263215.html
参看:
http://blog.chinaunix.net/uid-22516719-id-263215.html
#5
牛逼!
#1
弄清楚地址和值,弄清你代码中的每个变量的值和地址
#2
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]);
}
#3
仅供参考:
#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
//
#4
动态分配二维数组不像你这种写
参看:
http://blog.chinaunix.net/uid-22516719-id-263215.html
参看:
http://blog.chinaunix.net/uid-22516719-id-263215.html
#5
牛逼!