我无法知道为什么在2d数组的情况下我们必须使用类型转换(int *)
?
我想知道的另一件事是,为什么我们不能使用*(*(p+i)+j))
来访问以下代码中的2d数组?是否总是需要使用p + col*i + j
?当*(*(p+i)+j))
包含数组的基地址且p
等同于*(*(p+i)+j))
时,为什么我不能使用a[i][j]
?
提前谢谢。
main()
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,0,1,6
};
int *p,i,j;
p=(int *)a; // this is my doubt why did we use int *
for(i=0;i<3;i++)
{
for(j=0;j<4;j++) {
printf("%d",*(*(p+i)+j)); // here is my 2nd doubt
}
}
}
答案 0 :(得分:1)
您的代码甚至无法编译,正是您的第二个疑问所在。我已经纠正了它:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,0,1,6,
};
int *p, i, j;
p = a[0]; // No cast, just address the 1st row
for (i = 0; i < 3; i++) {
for (j = 0; j < 4; j++) {
printf("%d", *(p + 4*i + j)); // corrected pointer arithmetic
}
}
}
指针p
不知道它正在寻址一个2-dim数组,它只是一个int指针。
你确定要打印数字而不用空格分隔它们吗?
答案 1 :(得分:1)
您提供的代码由于行而无法编译:
printf("%d",*(*(p+i)+j));
你要解除引用两次int *
您可以创建一个指针来引用指向4个元素数组的类型指针的数组a。 请参阅附带的代码,其中在执行嵌套for循环期间打印出所有指针。
#include<stdio.h>
main()
{
int a[3][4]={
1,2,3,4,
5,6,7,8,
9,0,1,6
};
int (*p)[4],i,j;
p = a;
for(i=0;i<3;i++){
printf("row pointer: %p\n",p+i);
for(j=0;j<4;j++){
printf("element pointer: %p\n", (*(p+i))+j );
printf("element: %d\n",*( (*(p+i)) + j ) );
}
}
}