我正在尝试使用一个函数创建变量矩阵,该函数输入一个空数组指针m
并输出矩阵中具有值m
元素的int数组指针1,2,3,4,...n
。我使用变量k并向上增加该值来完成此操作(不确定这是否是最佳方法)。
我在subscripted value is not an array, pointer, or vector
的for循环中得到一个matrix[i][j] = k++;
,但我不确定为什么它只出现在for循环中而没有其他地方。
如果我输入一个称为矩阵的int数组指针,我不应该得到这个错误吗?
int *create_matrix(int* matrix) {
int i,j;
int k = 0;
// 'total' will be 70 = 10 * 7
int total = sizeof(matrix);
// 'column' will be 7 = size of first row
int column = sizeof(matrix[0]);
// 'row' will be 10 = 70 / 7
int row = total / column;
for (i=0; i < row; i++) {
for (j=0; j < column; j++) {
matrix[i][j] = k++;
}
}
return matrix;
}
int main(void) {
// Creating a custom matrix.
int m[3][4] = {0};
create_matrix(*m);
return 0;
}
答案 0 :(得分:1)
您需要了解数组和指针之间的区别。您可以将指针指向矩阵,但是只要您仅通过指针访问数组,有关大小和维数的信息就会丢失。
您需要执行以下操作:
int *create_matrix(int* matrix, size_t size_x, size_t size_y) {
...
}
int main()
{
int m[3][6];
size_t size_y=sizeof m[0]/sizeof m[0][0];
size_t size_x=sizeof m / sizeof m[0];
create_matrix(m);
}
答案 1 :(得分:1)
要做
int m[3][4] = {0};
create_matrix(*m);
等同于
int m[3][4] = {0};
create_matrix(m[0]);
所以等价于
int m[4] = {0};
create_matrix(m);
// 'total' will be 70 = 10 * 7
int total = sizeof(matrix);
矩阵是int *
,如果地址使用32b,则sizeof(matrix)
的值为4,如果地址使用64b,则// 'column' will be 7 = size of first row
int column = sizeof(matrix[0]);
的值为8
主中矩阵的有效大小无关紧要
matrix[0]
matrix[i][j] = k++;
是一个 int ,因此您可以得到一个 int 的大小(可能是4或8)
matrix[i][j]
因为矩阵是 int * 形式,#include <stdio.h>
void fill_matrix(int matrix[][4], size_t row) {
size_t i, j;
int k = 0;
for (i=0; i < row; i++) {
for (j=0; j < sizeof(matrix[0])/sizeof(int); j++) {
matrix[i][j] = k++;
}
}
}
int main(void) {
// Creating a custom matrix.
int m[3][4] = {0};
fill_matrix(m, sizeof(m)/sizeof(m[0]));
size_t i, j;
for (i=0; i < sizeof(m)/sizeof(m[0]); i++) {
for (j=0; j < sizeof(m[0])/sizeof(int); j++) {
printf("matrix[%d][%d] = %d\n", i, j, m[i][j]);
}
}
return 0;
}
无效。
将其命名为矩阵并没有帮助。
您的程序可以是:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
matrix[0][0] = 0
matrix[0][1] = 1
matrix[0][2] = 2
matrix[0][3] = 3
matrix[1][0] = 4
matrix[1][1] = 5
matrix[1][2] = 6
matrix[1][3] = 7
matrix[2][0] = 8
matrix[2][1] = 9
matrix[2][2] = 10
matrix[2][3] = 11
编译和执行:
i*10+j
如果您使用k++
而不是matrix[0][0] = 0
matrix[0][1] = 1
matrix[0][2] = 2
matrix[0][3] = 3
matrix[1][0] = 10
matrix[1][1] = 11
matrix[1][2] = 12
matrix[1][3] = 13
matrix[2][0] = 20
matrix[2][1] = 21
matrix[2][2] = 22
matrix[2][3] = 23
初始化矩阵的每个单元格,那么在打印时可能更容易看到:
{{1}}
答案 2 :(得分:0)
您的尝试是合理的尝试,但它揭示了一些有关C对象如何工作的误解。没关系。您的例子是一个很好的教学例子,我相信您会为自己的成功感到高兴。现在尝试这个:
static const int NO_ROWS = 3;
static const int NO_COLUMNS = 4;
int *create_matrix(
int *const matrix, const int no_rows, const int no_columns
) {
int k = 0;
for (int i = 0; i < no_rows; i++) {
for (int j = 0; j < no_columns; j++) {
matrix[no_columns*i+j] = k++;
}
}
return matrix;
}
int main(void) {
// Creating a custom matrix.
int m[NO_ROWS][NO_COLUMNS];
create_matrix(m[0], NO_ROWS, NO_COLUMNS);
return 0;
}
您的矩阵被构造为数组的数组。但是,在C语言中,数组只是一个存储区域,可以在其中存储一系列相同类型的对象(在您的情况下为int
)。符号m
由C编译器解释为
int[NO_COLUMNS]
。问题是,除非您愿意对类型进行硬编码,否则没有真正整洁,直接的方法来为预编译函数指定类型int[NO_COLUMNS]
。因此,一种处理create_matrix()
中矩阵的相对简单的方法将是如图所示的单个线性数组。
这里要理解的一点是C无法理解矩阵的形状。 C看到的是线性存储区域,而不是行和列。
要把握的另一点是,传递给数组的函数仅接收数组的初始地址。如果需要大小,则必须单独传递。