我正在尝试接受并使用相同的整数打印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++)
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??
}
答案 0 :(得分:1)
你的答案非常简单你为数组做这个(*(arr + n))arr是一个地址,n是否
您搜索的元素地址。如果要在矩阵中搜索地址,必须先将矩阵地址转换为数组地址,例如:
*(*垫+ 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]?
}
}
答案 1 :(得分:0)
*(a+i)
绝对是a[i]
。
您的代码中的许多错误需要先修复。
您的数组读取值超出范围。您按int a[1][4]
( 1 * 4 = 4 元素的空间)定义了数组,并且您读取了 3 * 4 = 12 元素。
此外a
指向整个2D数组,a+1
指向下一个2D数组。所以你需要通过指向数组的第一个元素来访问。
所以基本上有效的访问是
a[0][1] = *( a[0] + 1 )
和
for(i=0;i<12;i++)
printf("%d\n",*(a[0]+i));
答案 2 :(得分:0)
什么是*(a + i)?它是[i]吗? - 是的。你可以用多种形式表示[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 + i)来打印2D数组)!
答案 3 :(得分:0)
你可以做的最好的方法是获取指向2D数组基址的指针,然后按照你想要的方式线性遍历数组。
另外,正如Sathish已经回答的那样,*(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));
}
}