C 如何使用指针声明二维数组?
您好,我在使用指针声明二维数组时遇到问题。我是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;
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
changechar 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