1

我必须使用这样声明的给定函数:

void someFunc (char** characters, int from, int to);

问题是,我找不到将矩阵传递给它的方法,例如:

char matrix[4][4] = { { 'a', 'e' , 'i', 'm'}, 
                      { 'b', 'f' , 'j', 'n'},  
                      { 'c', 'g' , 'k', 'p'},  
                      { 'd', 'h' , 'l', 's'} };
    someFunc(matrix, 2, 3);   //doesnt work
    someFunc(&matrix, 2, 3);  //doesnt work

编译器抱怨,但我无法更改 someFunc 的签名,那么我该如何将 char 矩阵传递给函数?

4

5 回答 5

2

而不是使用自动矩阵,只是 malloc 一个指向指针的指针,代码如下所示

main(void)
{
    int i;
    char **ptr = NULL;
    ptr = (char**)malloc(sizeof(char) * 4);
    for(i = 0 ; i < 4 ; i++)
         ptr[i] = (char*)malloc(sizeof(char) * 4);

    //initialize your matrix here 
    someFunc(ptr , 2 , 3); 
}

或者,如果您准备修改函数原型(只是一点点),请改用这个,而void sumFunc(char matrix[][4) , int from , int to)您无需更改任何其他内容

于 2013-08-30T16:22:54.497 回答
2

正如@IgorTandetnik 所说

像这样定义

char* data[]= {matrix[0], matrix[1], matrix[2], matrix[3]};
someFunc(data, 2, 3);   // works fine

用矩阵的每一行初始化的字符指针数组,然后将其作为参数传递

测试代码:

   #include<stdio.h>
   void someFunc (char** characters, int from, int to);

    char matrix[4][4] = { { 'a', 'e' , 'i', 'm'},
                  { 'b', 'f' , 'j', 'n'},
                  { 'c', 'g' , 'k', 'p'},
              { 'd', 'h' , 'l', 's'} };
   main()
   {


  char* data[]= {matrix[0], matrix[1], matrix[2], matrix[3]};
  someFunc(data, 2, 3);   
   }

    void someFunc (char** c , int from, int to)
   {

  int i=0,j=0;

  for(i=0;i<4;i++) 
  for(j=0;j<4;j++)
  printf("%c\n",c[i][j]); //printf("%c",*(c[i]+j));

  }
于 2013-08-30T15:37:46.403 回答
1

char **变量的一个例子是:

char  *array[]={"this","is","char","pointer"};

像这样使用:

someFunc(array, 2, 3);

前面的数组的一个例子必须是这样的:

char *array[][5] = { 
{"this","is","char","element","one"},  
{"this","is","char","element","two"},  
{"this","is","char","element","three"}};  

但这不是您的原型所需要的。使用前面的例子来看看这对你有用。

[编辑] 根据您的问题和我的评论,这里是如何访问数组的内容。(它是随机的,可以以您需要的任何格式打印)。

    #include <windows.h>
#include <ansi_c.h>

int main(void)
{
    char *array[]={"this","is","char","pointer"};
    int i,j;

    //print in columns
    printf("Columns:\n");
    for(i=0;i<7; i++)
    {

        for(j=0;j<4;j++)
        {
            if(i> strlen(array[j])) 
                printf(" ");
                else
                printf("%c", array[j][i]);  
        }
        printf("\n");
    }
    //print in rows (easier)
    printf("\n\nRows:\n");
    for(i=0;i<4;i++)
    {
        printf("%s\n", array[i]);   
    }
    getchar();
    return 0;   
}
于 2013-08-30T15:44:39.883 回答
1

下面的代码将起作用。但是您可能需要在函数中使用一个索引而不是两个索引来访问数组。当您声明一个双索引数组时,数据不会存储为“指向指针的指针”。所以你不能使用char **foo1传递char foo0[ ][ ]

void someFunc (char* characters)
{
    char c = character[0]; // c = 'a'
    c = character[4]       // c = 'b'
    c = character[8]       // c = 'c'
    c = character[12]      // c = 'd'
}


void main(void)
{
    char matrix[4][4] = { 
    { 'a', 'e' , 'i', 'm'}, 
    { 'b', 'f' , 'j', 'n'},  
    { 'c', 'g' , 'k', 'p'},  
    { 'd', 'h' , 'l', 's'} };

    someFunc((char*)matrix);
}
于 2013-08-30T15:48:03.697 回答
0

我曾经有过类似的经历,我发现使用 char 矩阵会带来一些问题……这是我的实际建议,希望你能理解。(我知道已经晚了,但也许是为了帮助别人)

void someFunc(char* matrix, int from, int to){/*function declaration*/}


int main(){
int x = 4; //first matrix's dimension
int y = 4; //second matrix's dimension
char matrix[x*y];
//printing the matrix all in a single row
for(int i=0, i<x, i++)
   for(int j=0, j<y, j++)
      printf("%c", matrix[i+j*x]);
//it is just way simpler, reduces a ton of complexity, and having a string is much more flexible than having a matrix, especially with chars
return 0
}
于 2021-12-16T18:57:35.487 回答