作者共发了4篇帖子。 内容转换:不转换▼
 
点击 回复
834 3
【教程】用calloc函数创建二维数组的两种方法
一派护法 十九级
1楼 发表于:2016-1-6 11:18
【方法一:一次性创建全部数组空间】
#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 创建二维数组 int[4][10]
    int i, j;
    int **array = (int **)calloc(4, sizeof(int *)); // 首先创建顶层指针array[][]
    array[0] = (int *)calloc(4, 10 * sizeof(int *)); // 这个二维数组一共有4 * 10个int型的连续空间,把这40个元素的空间直接一次性创建,然后把其中第一个元素的地址赋给指针数组array的第一个元素
     
   
    /*
    其实这个二维数组就是一个连续的40个int空间
    和一位数组int[40]没什么本质区别
    只不过我们又创建了指针数组int *array[4],其中这个数组的每个元素都是一个指针
    第一个指针array[0]指向这个空间的第0个元素开头
    第二个指针array[1]指向这个空间的第10个元素开头
    第三个指针array[2]指向这个空间的第20个元素开头
    第四个指针array[3]指向这个空间的第30个元素开头
    这样一来,我们就可以以为array[0] ~ [3]每个都是一个长度为10的int数组了
    至于*array其实就相当于array[0]
    */
    array[1] = array[0] + 10; // 把第10个元素的地址赋给array[1]
    array[2] = array[0] + 20;
    array[3] = array[0] + 40;
    // array[0] 就是我们刚才创建的空间的首地址
   
    for (i = 0; i < 4; i++)
        for (j = 0; j < 10; j++)
            array[i][j] = (i + 1) * (j + 2);
   
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 10; j++)
            printf("%d ", array[i][j]);
        putchar('\n');
    }
   
    free(*array); // 一次性释放全部int空间
    free(array); // 释放指针空间
    return 0;
}
输出结果:
2 3 4 5 6 7 8 9 10 11
4 6 8 10 12 14 16 18 20 22
6 9 12 15 18 21 24 27 30 33
8 12 16 20 24 28 32 36 40 44

--------------------------------
Process exited after 0.006671 seconds with return value 0
Press any key to continue . . .
一派护法 十九级
2楼 发表于:2016-1-6 11:27
【方法2:分别创建每个第二维空间】
#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 创建二维数组 int[4][10]
    int **array = (int **)calloc(4, sizeof(int *)); // 创建指针数组array[n]
    int i, j;
    array[0] = (int *)calloc(10, sizeof(int)); // 分别给每个指针数组创建空间并指向它
    array[1] = (int *)calloc(10, sizeof(int));
    array[2] = (int *)calloc(10, sizeof(int));
    array[3] = (int *)calloc(10, sizeof(int));
   
    for (i = 0; i < 4; i++)
        for (j = 0; j < 10; j++)
            array[i][j] = (i + 1) * (j + 2);
   
    for (i = 0; i < 4; i++)
    {
        for (j = 0; j < 10; j++)
            printf("%d ", array[i][j]);
        putchar('\n');
    }
   
    free(array[0]);
    free(array[1]);
    free(array[2]);
    free(array[3]);
    free(array);
   
    return 0;
}
一派护法 十九级
4楼 发表于:2016-4-16 20:35
【封装成函数】
#include <stdio.h>
#include <stdlib.h>

int **create2d(int row, int col)
{
    int i;
    int **pp = (int **)malloc(row * sizeof(int *));
    *pp = (int *)malloc(row * col * sizeof(int));
    for (i = 1; i < row; i++)
        pp[i] = pp[i - 1] + col;
    return pp;
}

void free2d(int **pp)
{
    free(*pp);
    free(pp);
}

int main()
{
    int **a = create2d(2, 3);
    int i, j;
    a[0][0] = 10;
    a[0][1] = 20;
    a[0][2] = 30;
    a[1][0] = 40;
    a[1][1] = 50;
    a[1][2] = 60;
   
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
            printf("%d ", a[i][j]);
        putchar('\n');
    }
   
    free2d(a);
    return 0;
}
一派护法 十九级
5楼 发表于:2016-6-13 13:40
【C++创建二维数组的简易方法】
#include <stdio.h>

int main(void)
{
    int (*arr)[3] = new int[2][3];
    arr[0][0] = 10;
    arr[0][1] = 20;
    arr[0][2] = 30;
    arr[1][0] = 40;
    arr[1][1] = 50;
    arr[1][2] = 60;
   
    int *p;
    for (p = arr[0]; p < arr[0] + 6; p++)
    {
        printf("%d\n", *p);
    }

    delete[] arr;
    return 0;
}

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:834 回复数:3
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-6-13 13:40
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。