自己构造二级指针,实现二维数组使用

时间:2022-09-06 08:42:10
自己构造二级指针,实现二维数组使用
先构造一个指针数组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;

#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

#5


引用 2 楼 qq423399099 的回复:
int *ptr = (int *)malloc(3 * sizeof(int *));应该是int **ptr = (int **)malloc(3 * sizeof(int *));
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]);
}
自己构造二级指针,实现二维数组使用牛逼!

#1


弄清楚地址和值,弄清你代码中的每个变量的值和地址

#2


int *ptr = (int *)malloc(3 * sizeof(int *));应该是int **ptr = (int **)malloc(3 * sizeof(int *));
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

#5


引用 2 楼 qq423399099 的回复:
int *ptr = (int *)malloc(3 * sizeof(int *));应该是int **ptr = (int **)malloc(3 * sizeof(int *));
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]);
}
自己构造二级指针,实现二维数组使用牛逼!