关于Arduino中二维数组作为函数参数的问题

我有一个关于Arduino里,二维数组作为函数参数的问题
代码如下:

char tastatur[3][3] = {
  {'a','c','1'},
  {'g','8','5'},
  {'q','Q','s'}
};

void ausgabe(char *tas,int hangshu,int lieshu);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  ausgabe(tastatur,3,3);
}


void ausgabe(char *tas,int hangshu,int lieshu){
  for(int i = 0;i < hangshu;i++)
  {
    for(int j = 0;j < lieshu;j++)
    {
      Serial.println(tas[i][j]);
      delay(1000);
    }
  }
}

编译后报了如下错误:
Compilation error: cannot convert 'char ()[3]' to 'char' for argument '1' to 'void ausgabe(char*, int, int)'
具体报错信息如下:

C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino: In function 'void loop()':
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino:16:23: error: cannot convert 'char (*)[3]' to 'char*' for argument '1' to 'void ausgabe(char*, int, int)'
   ausgabe(tastatur,3,3);
                       ^
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino: In function 'void ausgabe(char*, int, int)':
C:\Users\91274\AppData\Local\Temp\.arduinoIDE-unsaved2023515-5160-1inuzg1.r527\sketch_jun15a\sketch_jun15a.ino:25:30: error: invalid types 'char[int]' for array subscript
       Serial.println(tas[i][j]);
                              ^

exit status 1

Compilation error: cannot convert 'char (*)[3]' to 'char*' for argument '1' to 'void ausgabe(char*, int, int)'

如果把函数ausgabe()里面的for循环直接放在loop里是没有问题的。
就想知道如果二维数组作为函数参数需要注意些什么,为什么这里会报错。

#include <stdio.h>
 
#define ROW 2   //二维数组的行数
#define COL 2   //二维数组的列数
 
//4个版本的求和函数
//方式一:数组形式
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);
 
//方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
int TwoDimArraySum2(int (*prArray)[COL], int row, int col);
 
//方式三:指针形式,pr是一个指向int的指针
int TwoDimArraySum3(int *pr, int row, int col);
 
//方式四:变长数组(C99开始支持)
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);
 
int main(void)
{
    int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};
    int result;
 
    //方式一
    result = TwoDimArraySum1(twoDimArray, ROW, COL);
    printf("Sum1函数结果:%d\n", result);
 
    //方式二
    result = TwoDimArraySum2(twoDimArray, ROW, COL);
    printf("Sum2函数结果:%d\n", result);
 
    //方式三
    result = TwoDimArraySum3(twoDimArray[0], ROW, COL);
    printf("Sum3函数结果:%d\n", result);
 
    //方式四
    result = TwoDimArraySum4(ROW, COL, twoDimArray);
    printf("Sum4函数结果:%d\n", result);
 
    return 0;
}
 
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += twoDimAr[i][j];
            // result += *(*(twoDimAr + i) + j);
        }
    }
    return result;
}
 
int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += prArray[i][j];
            // result += *(*(prArray + i) + j);
        }
    }
    return result;
}
 
int TwoDimArraySum3(int *pr, int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += pr[i*col + j];
            // result += *(pr + i*col + j);
        }
    }
    return result;
}
 
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
{
   int i, j;
   int result = 0;
 
   for (int i = 0; i < row; i++)
   {
       for (int j = 0; j < col; j++)
       {
           //下面两种寻址方式都行
           result += twoDimAr[i][j];
           // result += *(*(twoDimAr+ i) + j);
       }
   }
   return result;
}