首页 > 解决方案 > 使用指针将二维数组传递给 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");
    }
}

标签: carrayspointers

解决方案


第一个答案 要使其成为指针,您需要将其括在括号内。

当阅读这样的定义时,从最深的名字开始,然后从右边开始,尊重优先级。

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;
}

推荐阅读