首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中通过指针传递二维数组?

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

Stack Overflow用户
提问于 2013-05-24 05:40:22
回答 4查看 85.9K关注 0票数 42

我正在学习C语言,但在将二维数组的指针传递给另一个打印二维数组的函数时遇到了问题。任何帮助都将不胜感激。

代码语言:javascript
复制
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" );
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-24 05:42:10

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

代码语言:javascript
复制
void printarray( char (*array)[50], int SIZE )

或者等效地:

代码语言:javascript
复制
void printarray( char array[][50], int SIZE )
票数 36
EN

Stack Overflow用户

发布于 2013-05-24 06:05:14

在main()中,变量“数组”被声明为

代码语言:javascript
复制
char array[50][50];

这是一段2500字节的数据。当main()的“数组”被传递时,它是指向该数据开头的指针,是指向期望以50行为单位组织的字符的指针。

然而,在函数printarray()中,您可以声明

代码语言:javascript
复制
 char **array

这里的“char *pointer”是指向数组的指针。

void printarray( char array[][50], int SIZE )的@Lucus suggestion是有效的,除了它不是通用的,因为你的大小参数必须是50。

想法:消除(是的) printarray()中参数数组的类型

代码语言:javascript
复制
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()中的“数组”成为指针数组。

代码语言:javascript
复制
// 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);
...
票数 10
EN

Stack Overflow用户

发布于 2016-11-25 05:06:29

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

代码语言:javascript
复制
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" );
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16724368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档