如何使用指针声明二维数组?

时间:2016-01-17 17:54:56

标签: c pointers

你好,我在使用指针声明二维数组时遇到问题。我是C的新手。

int main(){

    int x = 0;
    int y = 0;

    int *xdim;
    int *ydim;


    printf("Enter x:\n");
    scanf("%d", &x); 
    printf("Enter y:\n");
    scanf("%d", &y);

    xdim = &x;
    ydim = &y;

    char sq[xdim][ydim];

    return 0;
}

我希望二维数组char sq保存用户输入的值。我得到错误非整数类型* int。我也是新手。

5 个答案:

答案 0 :(得分:1)

使用VLA(在C99中允许,或作为许多编译器的扩展),您需要做的就是:

int xdim, ydim;
scanf("%d %d", &xdim, &ydim);

char vla_array[xdim][ydim];

如您所见,不需要指针。

第二个选项是使用“普通”数组。您需要声明一个足够大的数组,并且只使用它的一部分:

#DEFINE X_MAX_DIM 100
#DEFINE Y_MAX_DIM 100

char vla_array[X_MAX_DIM][Y_MAX_DIM];

int xdim, ydim;
scanf("%d %d", &xdim, &ydim);
// check xdim and ydim are acceptable sizes

// from now on you use up to `xdim x ydim` of your array, even if
// it was declared as `100x100`

只有在事先知道阵列允许的最大尺寸时,才能使用此功能。

第三种选择是使用动态分配。如果阵列非常大,这是唯一的选择。然而,这是一个高级主题,因此您现在不会处理此问题。

答案 1 :(得分:1)

int** ptr = NULL;
ptr = new int*[val];

for(int i=0; i < val; i++)
{
    ptr[i] = new int[val];
}

上面的代码分配val * val的二维数组

答案 2 :(得分:0)

char sq[xdim][ydim];更改为char sq[*xdim][*ydim];,否则您会传递值的位置而不是值本身。
但在这种情况下不必使用指针,您可以使用xy

答案 3 :(得分:0)

在您播放的代码中发生错误,因为在此声明中

char sq[xdim][ydim];

使用了指针xdimydim而不是整数。你可以写

char sq[*xdim][*ydim];

虽然没有必要这样使用指针。

如果您的编译器支持可变长度数组,那么您可以编写

int main( void )
{
    size_t m = 0;
    size_t n = 0;

    printf("Enter x:\n");
    scanf("%zu", &m); 
    printf("Enter y:\n");
    scanf("%zu", &n);

    if ( !m || !n ) return 1;

    char sq[m][n];

    //...     

    return 0;
}

否则,您必须动态分配数组。例如

#include <stdlib.h>

int main( void )
{
    size_t m = 0;
    size_t n = 0;

    printf("Enter x:\n");
    scanf("%zu", &m); 
    printf("Enter y:\n");
    scanf("%zu", &n);

    if ( !m || !n ) return 1;

    char **sq = malloc( m * sizeof( char * ) );

    for ( size_t i = 0; i < m; i++ ) sq[i] = malloc( n * sizeof( char ) );

    //...

    for ( size_t i = 0; i < m; i++ ) free( sq[i] );
    free( sq );

    return 0;
}

答案 4 :(得分:0)

我相信,如果我明白你的要求,这应该有用。

在2D数组中使用单个指针;

#include <stdio.h>
#include <stdlib.h>
int x = 0, y = 0;
char *arr = (char *)malloc(x * y * sizeof(int));