8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 C 中通过指针传递二维数组?

Thom Giovans 1月前

123 0

我正在学习 C 语言,在将二维数组的指针传递给另一个函数然后打印二维数组时遇到了麻烦。如能得到任何帮助我将不胜感激。int main( void ){ char array[50][50];...

我正在学习 C,在将二维数组的指针传递给另一个函数然后打印二维数组时遇到了麻烦。如能得到任何帮助我将不胜感激。

int main( void ){
    char array[50][50];
    int SIZE;

    ...call function to fill array... this part works.

    printarray( array, SIZE );
}

void printarray( char **array, int SIZE ){
    int i;
    int j;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}
帖子版权声明 1、本帖标题:如何在 C 中通过指针传递二维数组?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Thom Giovans在本站《c》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您可以使用双指针轻松传递二维数组。

      void printarray( char **array, int n)
      {
         int i, j;
         for(i=0; i<n; i++ )
         {
             for(j=0; j<n; j++)
             {
                printf("%c ", array[i][j] );
             }
            printf( "\n" );
         }
      }
    
      int main()
      {
          int n = 2;
          int i, j;
    
          char **array = (char **) malloc(n * sizeof(char*));
    
          for (i=0; i<n; i++) 
          {
            array[i] = (char *) malloc(n* sizeof(char));
          }
    
         for (i=0; i<n; i++)
         {
           for (j=0; j<n; j++)
           {
               scanf("%c ", &array[i][j]);
           }
         }
    
         printarray(array, n);
    
         return 0;
      }
    

    完整代码: Ideone

  • 您需要使用以下方法将二维数组强制转换为简单指针 (char*)array .

    相应的伪参数应该只是 char *array ,而不是 char **array 。但是,您需要知道内存布局才能正确处理 2D 数组。在这种情况下,它应该是 array[i*SIZE+j] *(array+i*SIZE+j) 。生成的代码是:

    #include<stdio.h>
    void printarray( char *array, int SIZE ){
        for( int j = 0; j < SIZE; j++ ){
            for( int i = 0; i < SIZE; i ++){
                printf( "%c ", array[i*SIZE+j] );
            }
            printf( "\n" );
        }
    }
    
    
    int main(){
    
      char array[50][50];
        printarray( (char*)array, 50 );
        return 0;
    }
    
    
  • 这里没有我想要的答案,所以我发布了我对这个问题的简单解决方案

    #include <iostream>
    
    using namespace std;
    
    void example(int* mat, int dim0, int dim1){
        
        for(int i = 0; i < dim0; ++i) {
             for(int j = 0; j < dim1; ++j) {
                 auto cur_index = i * dim1 + j;
                cout<< *(mat + cur_index) << endl;
            }
        }
    }
    
    int main()
    {
        const int dim0 = 3;
        const int dim1 = 2;
    
        int mat[dim0][dim1];
        
        for(int i = 0; i < dim0; ++i) {
             for(int j = 0; j < dim1; ++j) {
                mat[i][j] = i * dim1 + j;
            }
        }
        
        example(&(mat[0][0]), dim0, dim1);
        return 0;
    }
    
  • 没有 char (*array)[SIZE] = array0; 的一个干净的替代方案是 printarray(int SIZE, char array[SIZE][SIZE])

  • 这是我喜欢的答案,因为它适用于您在编译时不知道大小的情况。但是,我想指出 2 点:(1.) 如果您传递两个维度大小(例如,行和列),则数组应声明为 char (*array)[columns] = array0; (2.) 如果您使用 const 正确性(在这种情况下,您不会更改数组中的任何值,因此这是合适的),那么您需要将 array0 参数声明为 const void *array0,并在主体中将数组声明为 char const (*array)[columns] = array0;

  • 由于 C99 支持动态大小数组,因此以下样式对于传递二维数组更为方便:

    void printarray( void *array0, int SIZE ){
        char (*array)[SIZE] = array0;
        int i;
        int j;
        for( j = 0; j < SIZE; j++ ){
            for( i = 0; i < SIZE; i ++){
                printf( "%c ", array[j][i] );
            }
            printf( "\n" );
        }
    }
    
  • @chux:在其他人真正提供帮助之前,您需要指定“我的编译器”是什么。是 GCC?Clang?还是微软的东西?错误消息是什么?某些编译器可能默认使用旧语言版本(例如 GCC 的 c89)或非标准版本(例如 gnu89)。对于 GCC 或 clang,请尝试“-std=c99”或“-std=c1x”。对于微软编译器,请尝试 GCC 或 clang。您是否包括定义size_t?(您可以在声明中使用其他整数类型作为维度;可以是int而不是size_t。)

  • @Eric Postpischil:使用 \'void printarray(size_t Rows, size_t cols, char array[][cols]);\' 声明函数会导致我的编译器失败。这是对您建议的正确测试吗?

  • 引用 10

    传递给函数时,数组维度不需要固定;例如,可以将函数声明为 void printarray(size_t Rows, size_t cols, char array[][cols])。(我不知道为什么在它成为标准 14 年后还不为人所知。)

  • @Thomas,如果你想让你的代码自文档化,你可以这样做而不产生冗余。例如,使用 sizeof **array。那么至少如果你稍后更改数据类型,你可以免费获得大小调整。

  • @CarlNorum 只是因为它并不意味着你必须无情地用 1 替换它(或完全删除它)。sizeof 语句可以在很大程度上使你的代码具有自文档性。

  • 引用 13

    在 中 main() ,变量 \'array\' 声明为

    char array[50][50];
    

    这是一段 2500 字节的数据。当 main() 传递 的 \'array\' 时,它是指向该数据开头的指针。它是指向预期按 50 行排列的字符的指针。

    但在功能上 printarray() ,你声明

     char **array
    

    \'array\' 此处是指向 char *pointer .

    @Lucus 的建议是 void printarray( char array[][50], int SIZE ) 可行的,只不过它不是通用的,因为你的 SIZE 参数 必须 是 50。

    思路:defeat(yeech)中的参数数组类型 printarray()

    void printarray(void *array, int SIZE ){
        int i;
        int j;
        char *charArray = (char *) array;
    
        for( j = 0; j < SIZE; j++ ){
            for( i = 0; i < SIZE; i ++){
                printf( "%c ", charArray[j*SIZE + i] );
            }
            printf( "\n" );
        }
    }
    

    更优雅的解决方案是将“数组”制作成 main() 指针数组。

    // Your original printarray()
    void printarray(char **array, int SIZE ){
        int i;
        int j;
        for( j = 0; j < SIZE; j++ ){
            for( i = 0; i < SIZE; i ++){
                printf( "%c ", array[j][i] );
            }
            printf( "\n" );
        }
    }
    
    // main()
    char **array;
    int SIZE;
    // Initialization of SIZE is not shown, but let's assume SIZE = 50;
    // Allocate table
    array = (char **) malloc(SIZE * sizeof(char*));
      // Note: cleaner alternative syntax
      // array = malloc(sizeof *array * SIZE);
    // Allocate rows
    for (int row = 0; row<SIZE; row++) {
      // Note: sizeof(char) is 1. (@Carl Norum)
      // Shown here to help show difference between this malloc() and the above one.
      array[row] = (char *) malloc(SIZE * sizeof(char));
        // Note: cleaner alternative syntax
        // array[row] = malloc(sizeof(**array) * SIZE);
      }
    // Initialize each element.
    for (int row = 0; row<SIZE; row++) {
      for (int col = 0; col<SIZE; col++) {
        array[row][col] = 'a';  // or whatever value you want
      }
    }
    // Print it
    printarray(array, SIZE);
    ...
    
  • @Jarkid,前者是一个指向 50 个元素数组的指针,后者是一个包含 50 个指针的数组。

  • 函数头部中的 (*array)[50] 和 *array[50] 有什么区别?

  • 很好的答案。char (*array)[50] 声明一个指针,名称为 array,指向一个 50 个字符的 1d 数组。我认为评论中的解释有点模棱两可,我想改进。

  • 运行 cdecl explain 'char (*arr)[50]' 会将 arr 声明为指向 char 数组 50 的指针。

  • 你能用简单的英语解释一下语法'char *array[50]' 的意思吗?

  • Kate 1月前 0 只看Ta
    引用 19

    char ** 不代表二维数组 - 它将是一个指向指针的指针数组。 printarray 如果要将二维数组传递给它,则需要更改定义:

    void printarray( char (*array)[50], int SIZE )
    

    或者等价地:

    void printarray( char array[][50], int SIZE )
    
  • 引用 20

    @kotlomoy 因为 C 的 nD 数组语法充其量是模棱两可的,并且手动索引会迫使您考虑内存顺序(通常对缓存性能有用)。这也意味着您可以无缝切换到使用动态大小的数组(通过

返回
作者最近主题: