如何使用[rows] [cols]索引打印出我正在访问的int *?

时间:2014-01-20 14:37:46

标签: c multidimensional-array

我在printf上遇到编译错误(“%d”,arr [rows] [cols]);编译错误行:

//error C2109: subscript requires array or pointer type

我希望通过cols方便行。最简单的访问方式是什么?

#include <stdio.h>

void print_matrix(int* arr, int numrows, int numcolumns) {
    for(int rows = 0; rows < numrows; ++rows) {
        for(int cols = 0; cols < numcolumns; ++cols)
            printf("%d ", arr[rows][cols]);   //error C2109: subscript requires array or pointer type

        printf("\n");
    }
}

int main() {

    const int rows = 3;
    const int cols = 2;
    int arr[rows][cols] = { {1,2}, {3,4}, {5,6} };

    int* p = &arr[0][0];

    print_matrix(p, rows, cols);

    return 0;
}

更新:

为了一点点完整性,我想到了H2C03的评论,我应该更彻底地考虑一下。以下是另一种实现相同功能的方法,并且更简单,因为该函数采用简单的指针。

#include <stdio.h>

void print_matrix(int* arr, int rows, int cols) {
    int row, col;
    for( row = 0; row < rows; ++row) {
        for(col = 0; col < cols; ++col)
            printf("%d ", *(arr + row * cols + col));  

        printf("\n");
    }
}

void print_transpose(int* arr, int rows, int cols) {
    int row, col;
    for(row = 0; row < cols; ++row) {
        for( col = 0; col < rows; ++col)
            printf("%d ", *(arr + col * cols + row));  

        printf("\n");
    } 
}

int main() {

    const int rows = 3;
    const int cols = 2;
    int arr[3][2] = { {1,2}, {3,4}, {5,6} };
    int* p = arr;
    printf("matrix:\n");
    print_matrix(p, rows, cols);
    printf("transposed:\n");
    print_transpose(p, rows, cols);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

您需要将指针作为二维数组指针传递:

void print_matrix(size_t numrows, size_t numcolumns, int (* arr)[numcolumns]);

传递

print_matrix(rows, cols, arr);

答案 1 :(得分:1)

由于p是指向arr的第一个元素的指针,即p = &arr[0][0],如果我们取消引用p,我们会得到&arr[0][0]的值。现在arr是函数p中指针print_matrix的副本,因此如果我们取消引用arr,我们会得到arr[0][0]处的值。即*arr提供arr[0][0]arr[rows][cols]评估为*(*(arr+rows) + cols)。这是一个问题,因为*(arr+rows)给出的值不能再被取消引用。我建议一个更简单的解决方案:

void print_matrix(int* arr, int numrows, int numcolumns) 
{
int totalelements = numrows * numcolumns, i ; 

    for(i = 0; i < totalelements; ++i) 
    {
        printf("%d\t ", arr[i]);  
        if((i+1) % numcolumns == 0)
          printf("\n");
    }

}