我编写了以下简单程序来打印给定矩阵:
#include <stdio.h>
#include <stdlib.h>
char matrix[10][10] = {
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y', 'Z', '.', ',', '!', '?'},
{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'}
};
void printMatrix(char* matrix, int matrix_size)
{
for (int i = 0; i < matrix_size; i = i + 1)
{
for (int j = 0; j < matrix_size; j = j + 1)
{
printf("%c", matrix[i * matrix_size + j]);
if (j == matrix_size - 1)
printf("\n");
}
}
printf("\n");
}
int main()
{
printMatrix(matrix, 10);
}
程序按预期运行,但我的编译器(GNU)给出以下警告:
...warning: passing argument 1 of 'printMatrix' from incompatible pointer type [-Wincompatible-pointer-types]|
...note: expected 'char *' but argument is of type 'char (*)[10]'|
||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 3 second(s)) ===|
你能告诉我我做错了什么吗?
数组在表达式中使用或声明为函数参数时,“衰减”为指向第一个元素的指针。
char [10][10]
的第一个元素是 char [10]
类型。指向此类数组元素的指针是char (*)[10]
。因此:
预期 '
' 但参数类型为 'char *
'char (*)[10]
这些是不兼容的指针类型,因此您的代码无效 C。您的编译器无论如何都会生成一个可执行文件,因为您使用宽松的非标准设置运行它 - 我建议切换到这个:What compiler options are recommended for beginners learning C? 因为什么如果您运行由无效 C 组成的可执行文件,将会发生这种情况,这是任何人的猜测。
但是,C 中有一条规则说任何类型都可以使用字符指针逐字节检查。因此,如果您只是将代码更改为
printMatrix((char*)matrix, 10);
那么它是有效的 C 并且实际上保证可以按预期工作。
重写整个函数以正确使用二维数组是更好的做法:
void printMatrix (int matrix_size, char matrix[matrix_size][matrix_size])