我在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;
}
答案 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");
}
}