我很想知道为什么在我的情况下,同一个数组的地址,即数组b的地址在传递给函数操作()之前和之后都会发生变化,如输出图片所示。 请分享您的想法,并帮助我解决这个问题。谢谢!
#include <stdio.h>
void manipulation(int *pa,int *pb){
int i;
for(i=0;i<10;i++){
*(pb+i)=*(pa+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
}
}
int main(){
int a[10],b[10];
int i;
int *point;
point = &b[0];
printf("Enter the array elements\n");
for(i=0;i<10;i++){
scanf("%d\n",&a[i]);
}
for(i=0;i<10;i++){
printf("%04x\n",&point+i);
}
manipulation(&a[0],&b[0]);
return 0;
}
答案 0 :(得分:2)
因为你打印(指针的地址)+ i:
printf("%04x\n",&point+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
你想打印指针+ i:
printf("%04x\n",point+i);
printf("%d\t %04x\n",*pb+i,pb+i);
你也有一个错误:
printf("%d\t %04x\n",*pb+i,pb+i);
*pb+i
被解释为(*pb) + i
,它是数组加i的第一个值,或者只是pb[0]+i
。
你似乎得到了正确的答案,因为你的数组是1 2 3 ...
你可能想要这个:printf("%d\t %04x\n",*(pb+i),pb+i);
或简单地说:
printf("%d\t %04x\n",pb[i],pb+i);
答案 1 :(得分:1)
是的,真正的问题是将point
的地址与pb
的地址进行比较。
尝试使用point + i
(或&point[i]
)和pb + i
(或&pb[i]
)。我相信你会得到预期的答案。
如果您感到好奇,&point + i
是本地变量point
的内存位置加上i
的值。 &pb + i
是参数pb
的内存位置加上i
的值。它们是不同的变量,因此它们在内存中具有不同的位置。
答案 2 :(得分:0)
指向存储数组a的地址。 &amp; point打印点的地址并在循环中添加4。与&amp; pb的情况相同。 28fee8是存储点的地方,28fed4是存储pb的地方。