本人构造二级指针,实现二维数组使用

C语言 码拜 4年前 (2016-09-15) 634次浏览
本人构造二级指针,实现二维数组使用
先构造一个指针数组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;

#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

动态分配二维数组不像你这种写
参看:
http://blog.chinaunix.net/uid-22516719-id-263215.html

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明本人构造二级指针,实现二维数组使用
喜欢 (0)
[1034331897@qq.com]
分享 (0)