繁体   English   中英

声明和访问2D数组

[英]Declaring and accessing 2D array

如何使用数组指针(int *)创建和打印这种2d数组:

0 1 2 3 4 5 6 7 8...
1 2 3 4 5 6 7 8 9...
2 3 4 5 6 7 8 9 10...
3 4 5 6 7 8 9 ...
4 5 6 7 8 9...
5...

我目前有以下代码:

#include <stdio.h>
#include <stdlib.h>

void createMatrix(int * matrix, int row, int column)
{
    puts("Begin creating matrix.");
    int i, j;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < column; j++)
        {
            *(matrix) = i + j;
            matrix++;
        }
    }
    puts("Success!");
}

int printMatrix(int * matrix, int row, int column)
{
    puts("Begin printing matrix!");
    int i, j, valuesPrinted;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < column; j++)
        {
            printf("%5d ", *(matrix + i * j));
            valuesPrinted++;
        }
        puts("");
    }
    puts("Printing success!");
    return valuesPrinted;
}

int main()
{
    int row = 11;
    int column = 13;
    int * matrix = malloc(sizeof(int) * row * column);

    createMatrix(matrix, row, column);
    printMatrix(matrix, row, column);
    return 0;   
}

我想做的是:使用声明数组并将其分配给指针,然后将指针传递给函数并为其提供如上所述的值。 我认为问题在于我通过指针初始化2D数组并访问它的方式。

结果是:

    0     0     0     0     0     0     0     0     0     0     0     0     0
    0     1     2     3     4     5     6     7     8     9    10    11    12
    0     2     4     6     8    10    12     2     4     6     8    10    12
    0     3     6     9    12     3     6     9    12     3     6     9    12
    0     4     8    12     4     8    12     4     8    12     4     8    12
    0     5    10     3     8    13     6    11     4     9    14     7    12
    0     6    12     6    12     6    12     6    12     6    12     6    12
    0     7     2     9     4    11     6    13     8    15    10    17    12
    0     8     4    12     8     4    12     8    16    12     8    16    12
    0     9     6     3    12     9     6    15    12     9    18    15    12
    0    10     8     6     4    14    12    10     8    18    16    14    12

您的打印代码使用错误的表达式来访问矩阵的元素。 你有:

printf("%5d ", *(matrix + i * j));

你需要:

printf("%5d ", *(matrix + i * column + j));

要么:

printf("%5d ", matrix[i * column + j]);
int *matrix = malloc(sizeof(int) * row * column);
// could better be written as
int *matrix = malloc((row*column) * sizeof *matrix);

上面的语句动态分配一个大小为row * column的整数数组。 如果要像访问2D数组的元素一样访问此数组的元素,则第i行和第j列的元素都有索引

i * column + j

将您的printMatrix函数修改为-

int printMatrix(int * matrix, int row, int column)
{
    puts("Begin printing matrix!\n");
    int i, j, valuesPrinted;
    for(i = 0; i < row; i++)
    {
        for(j = 0; j < column; j++)
        { 
            // this is equivalent and more readabable
            // printf("%5d ", matrix[i*column + j]);
            printf("%5d ", *(matrix + i*column + j));
                                      //  ^ note i is multiplied by column
            valuesPrinted++;
        }
        puts("");
    }
    puts("Printing success!\n");
    return valuesPrinted;
}
printf("%5d ", *(matrix + i * column + j));

代替

printf("%5d ", *(matrix + i * j));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM