c - 使用指针将二维数组传递给 C 中的函数
问题描述
我是 C 新手,我正在学习指针。所以,我想传递一个二维数组的指针。我设法使它工作,但我仍然收到以下警告:
||=== Build: Debug in matriz (compiler: GNU GCC Compiler) ===|
C:\Users\pauli\.dev\c\uvv\matriz\main.c||In function 'main':|
C:\Users\pauli\.dev\c\uvv\matriz\main.c|15|warning: passing argument 1 of
'printMatriz' from incompatible pointer type [-Wincompatible-pointer-types]|
C:\Users\pauli\.dev\c\uvv\matriz\main.c|4|note: expected 'int * (*)[2]' but
argument is of type 'int (*)[2][2]'|
C:\Users\pauli\.dev\c\uvv\matriz\main.c||In function 'printMatriz':|
C:\Users\pauli\.dev\c\uvv\matriz\main.c|23|warning: format '%i' expects argument
of type 'int', but argument 2 has type 'int *' [-Wformat=]|
||=== Build finished: 0 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===|
||=== Run: Debug in matriz (compiler: GNU GCC Compiler) ===|
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define TAM 2
void printMatriz(int *matriz[TAM][TAM]);
int main()
{
int i, j, matriz[TAM][TAM];
for(i = 0; i < TAM; i++) {
for(j = 0; j < TAM; j++) {
printf("Matriz[%i][%i] = ", i, j);
scanf("%i", &matriz[i][j]);
}
}
printMatriz(&matriz);
return 0;
}
void printMatriz(int *matriz[TAM][TAM])
{
int i, j;
for(i = 0; i < TAM; i++) {
for(j = 0; j < TAM; j++) {
printf("%i\t", matriz[j][i]);
}
printf("\n");
}
}
解决方案
第一个答案 要使其成为指针,您需要将其括在括号内。
当阅读这样的定义时,从最深的名字开始,然后从右边开始,尊重优先级。
void printMatriz(int (*matriz)[TAM][TAM])
从内到外工作,从名字开始:
- 名称 matriz 是(在括号内螺旋)一个指向
- [TAM][TAM] 的二维数组
- 整数。
使用您的原始代码:
void printMatriz(int *matriz[TAM][TAM])
由内而外的工作:
- 名字matriz是一个
- [TAM][TAM] 的二维数组
- 指向
- 整数。
希望我的眼睛里没有太多的睡眠。
现在你已经挣扎了 第二个答案,现在你已经挖了一点。
typedef
通过在 typedef 声明中封装复杂性,使用说明符可以大大简化一些定义。
typedef int matriz_t[TAM][TAM]; /* typedef 简化了引用代码 */ void printTypedef(matriz_t *matriz) /*(注意:现在是一个简单的指针)*/ { 整数 i, j; for(i = 0; i < TAM; i++) { for(j = 0; j < TAM; j++) { printf("%i\t", (*matriz)[j][i]); /* 这里还需要 () */ } printf("\n"); } } 主函数() { 整数 i, j; matriz_t matriztdef; /* 没有比这更简单的了 */ for(i = 0; i < TAM; i++) { for(j = 0; j < TAM; j++) { printf("矩阵[%i][%i] = ", i, j); scanf("%i", &matriztdef[i][j]); } } printTypedef(&matriztdef); 返回0; }