C 为什么二维数组元素不使用*(a+;1)打印?
我正在尝试使用相同的整数接受和打印2D数组,让我们取C 为什么二维数组元素不使用*(a+;1)打印?,c,pointers,multidimensional-array,C,Pointers,Multidimensional Array,我正在尝试使用相同的整数接受和打印2D数组,让我们取I和j,但我没有得到预期的输出。我使用*(a+I)打印,但它似乎打印地址 谁能解释一下为什么会这样 #include<stdio.h> int main() { int a[3][4]; int i,j,k,l; printf("enter element\n"); for(i=0;i<3;i++) { for(j=0;j<4;j++)
I
和j
,但我没有得到预期的输出。我使用*(a+I)打印,但它似乎打印地址
谁能解释一下为什么会这样
#include<stdio.h>
int main()
{
int a[3][4];
int i,j,k,l;
printf("enter element\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
}
printf("#####################\n");
for(i=0;i<12;i++)
{
printf("%d\n",*(a+i)); // what is *(a+i)? is it a[i]?
} // how will it print all address??
}
#包括
int main()
{
INTA[3][4];
int i,j,k,l;
printf(“输入元素\n”);
对于(i=0;i您的答案非常简单,您可以对数组(*(arr+n))执行此操作,arr是一个地址,n是no
您搜索的元素地址的名称。如果要将地址搜索到矩阵中,必须首先将矩阵地址转换为数组地址,如:
*(*mat+n);
您的代码将是:
# include<stdio.h>
int main()
{
int a[3][4];
int i,j,k,l;
printf("enter element\n");
for(i=0; i<3; i++)
{
for(j=0; j<4; j++)
scanf("%d",&a[i][j]);
}
printf("#####################\n");
for(i=0; i<8; i++)
{
printf("%d\n",*(*a+i)); // what is *(a+i)? is it a[i]?
}
}
#包括
int main()
{
INTA[3][4];
int i,j,k,l;
printf(“输入元素\n”);
for(i=0;i*(a+i)
肯定是a[i]
代码中的许多错误需要首先修复
您的数组读取值超出范围。您通过int a[1][4]
(容纳1*4=4元素的空间)定义数组,然后读取3*4=12元素
另外,a
指向整个二维数组,a+1
指向下一个二维数组。因此,您需要通过指向数组的第一个元素进行访问
所以基本上有效的访问是
a[0][1] = *( a[0] + 1 )
及
for(i=0;i什么是*(a+i)?它是a[i]?-ya它是。你可以用多种形式表示a[i]。它们是*(a+i)或*(i+a)或i[a]。它们都只表示相同的内存位置
在您的程序中*(a+i)无法在同一函数中使用。请尝试将数组传递给另一个函数并在该函数中打印。请尝试以下代码-
#include<stdio.h>
void print(int *a,int r ,int c)
{
int i ,j;
for(i=0;i<r*c;i++)
printf("%d\n",*(a+i));
}
int main()
{
int a[2][2];
int i,j,k,l;
printf("enter element\n");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
scanf("%d",&a[i][j]);
}
printf("#####################\n");
print(a,2,2); // calling my function here
}
#包括
无效打印(整数*a、整数r、整数c)
{
int i,j;
对于(i=0;i您可以尝试实现的最佳方法是使用指向2D数组基址的指针,然后按照您的意愿线性遍历数组
同样,正如萨提斯已经回答的,*(a+i)=*(i+a)=a[i]=i[a]
在这里,在我的解决方案中,我刚刚添加了一个指向a的基址的指针p,因为2D数组线性存储在内存中,所以可以通过增加指向下一个数组元素的指针p来访问它
#include<stdio.h>
int main()
{
int a[3][4];
int i,j,k,li, *p;
printf("enter element\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
}
printf("#####################\n");
p = &a[0][0];
for(i=0;i<12;i++)
{
printf("%d\n",*(p+i));
}
}
#包括
int main()
{
INTA[3][4];
inti,j,k,li,*p;
printf(“输入元素\n”);
根据定义,for(i=0;i*(a+i)
实际上与a[i]相同
。它是数组a
的i
第个元素,它又是一个由4个整数组成的一维数组。在大多数上下文中,数组名称会衰减为指向其第一个元素的指针。这就是你打印地址的方式。除此之外,还有大量缓冲区溢出。你的scanf
循环超出了范围。因此你的程序将表现出未定义的行为,不管有什么更有用的答案将解释指针和2d数组。你将在循环/scanf中离开数组的边界。不知道你这样做是否是为了处理溢出。还要注意,你根本没有2d数组。a[1][4]
表示它是一个1乘4的数组,几乎是一维的。不必指定p=&a[0][0];12次。一次就足够了。
#include<stdio.h>
int main()
{
int a[3][4];
int i,j,k,li, *p;
printf("enter element\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
}
printf("#####################\n");
p = &a[0][0];
for(i=0;i<12;i++)
{
printf("%d\n",*(p+i));
}
}