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

C 如何使用指针声明二维数组?,c,pointers,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;

您好,我在使用指针声明二维数组时遇到问题。我是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。我对指针也是新手。

change
char sq[xdim][ydim]
字符sq[*xdim][*ydim],否则传递值的位置而不是值本身。

但是在这种情况下不需要使用指针,您可以只使用
x
y
change
char sq[xdim][ydim]
字符sq[*xdim][*ydim],否则传递值的位置而不是值本身。
但是在这种情况下不需要使用指针,您只需使用s(C99中允许使用s,或者作为许多编译器的扩展),即可使用
x
y
,只需执行以下操作:

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`
只有在事先知道数组允许的最大维度时,才能使用此选项


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

使用s(C99中允许使用s,或作为许多编译器的扩展),您只需执行以下操作:

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`
只有在事先知道数组允许的最大维度时,才能使用此选项



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

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

char sq[xdim][ydim];
使用的指针不是整数而是
xdim
ydim
。你可以写

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;
}
#包括
内部主(空)
{
尺寸m=0;
尺寸n=0;
printf(“输入x:\n”);
scanf(“%zu”、&m);
printf(“输入y:\n”);
scanf(“%zu”,&n);
如果(!m | |!n)返回1;
char**sq=malloc(m*sizeof(char*));
对于(size_t i=0;i
在您播撒的代码中发生错误,因为在此声明中

char sq[xdim][ydim];
使用的指针不是整数而是
xdim
ydim
。你可以写

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;
}
#包括
内部主(空)
{
尺寸m=0;
尺寸n=0;
printf(“输入x:\n”);
scanf(“%zu”、&m);
printf(“输入y:\n”);
scanf(“%zu”,&n);
如果(!m | |!n)返回1;
char**sq=malloc(m*sizeof(char*));
对于(size_t i=0;i
我相信如果我理解你的要求,这应该是可行的

在二维数组中使用单个指针

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

我相信如果我理解你的要求,这应该是可行的

在二维数组中使用单个指针

#include <stdio.h>
#include <stdlib.h>
int x = 0, y = 0;
char *arr = (char *)malloc(x * y * sizeof(int));
#包括
#包括
int x=0,y=0;
char*arr=(char*)malloc(x*y*sizeof(int));
int**ptr=NULL;
ptr=新整数*[val];
对于(int i=0;i
上述代码分配了val*val的2d数组

int**ptr=NULL;
ptr=新整数*[val];
对于(int i=0;i

上面的代码分配了val*val的2d数组

伙计们,对不起我的回答。我为得到一个dll工作而发疯。抱歉@Anonymous Penguin我的答案错了…只需使用
char sq[x][y],您不需要xdim/ydim@Ctx他只是想测试指针是如何工作的。使用
char sq[*xdim][*ydim]
如果
scanf
没有返回错误,它们将被初始化。我为得到一个dll工作而发疯。抱歉@Anonymous Penguin我的答案错了…只需使用
char sq[x][y],您不需要xdim/ydim@Ctx他只是想测试指针是如何工作的。如果
scanf
没有返回错误,则使用
char sq[*xdim][*ydim]
将它们初始化为
xdim=&x
。您无需提及VLA,就好像它们是不寻常的东西一样。它们是C的核心部分。OP使用C,因此它们可以使用VLA。如果他们不能使用VLA,他们应该指定他们使用的是C89,或者是选择使用无VLA选项的编译器,而不是纯C。(不提供VLA是允许的扩展。默认情况下,他们被认为是允许的。)@Leushenko我想我很清楚VLA何时被接受。@Leushenko使用VLA仍然是一种选择,例如,对于大型数组,应该避免使用它们。这是一个语言问题:“如果您同意…”意味着它们可能有一些不标准的地方,当然不需要提及扩展。不应阻止新的C用户使用标准功能。@Leushenko好的,我明白你的意思。我删除了“如果你没事”的部分,但是我留下了“C99和扩展”的信息。你不需要像提到一些东西一样提到VLA