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

问题描述 投票:0回答:6

我正在学习 C,并且在将 2D 数组的指针传递给另一个函数(然后打印 2D 数组)时遇到问题。任何帮助,将不胜感激。

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" );
    }
}
c arrays pointers
6个回答
39
投票

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

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

或等价:

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

11
投票

main()
中,变量“array”被声明为

char array[50][50];

这是一段2500字节的数据。当

main()
的“数组”被传递时,它是一个指向该数据开头的指针。它是一个指向字符的指针,预计按 50 行组织。

但是在函数

printarray()
中,你声明了

 char **array

“数组”这里是一个指向

char *pointer
的指针。

@Lucus 的建议

void printarray( char array[][50], int SIZE )
有效,但它不是通用的,因为你的 SIZE 参数必须 为 50。

想法: 击败(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);
...

5
投票

由于 C99 支持动态大小的数组,因此以下样式更方便地传递 2 维数组:

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

2
投票

这里的答案都不是我想要的,所以我发布了这个问题的简单解决方案

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

0
投票

您需要使用

(char*)array
将 2D 数组类型转换为简单指针。

相应的虚拟参数应该是

char *array
,而不是
char **array
。但是,您需要知道内存布局才能正确处理二维数组。在这种情况下,它应该是
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;
}


-2
投票

您可以使用双指针轻松传递二维数组。

  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

© www.soinside.com 2019 - 2024. All rights reserved.