C++ 数组在通过引用传递给函数之前和之后显示不同的地址
我很想知道为什么同一个数组的地址在传递给函数manipulation()之前和之后都在变化,如输出图片所示。 请分享你的想法,帮我解决这个问题。谢谢大家!C++ 数组在通过引用传递给函数之前和之后显示不同的地址,c++,c,arrays,pointers,C++,C,Arrays,Pointers,我很想知道为什么同一个数组的地址在传递给函数manipulation()之前和之后都在变化,如输出图片所示。 请分享你的想法,帮我解决这个问题。谢谢大家! #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)
#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;
}
#包括
无效操作(int*pa,int*pb){
int i;
对于(i=0;i是的,真正的问题是比较点
的地址和pb
的地址
尝试使用point+i
(或&point[i]
)和pb+i
(或&pb[i]
)。我相信您会得到预期的答案
如果您好奇的话,&point+i
是局部变量point
加上i
的值的内存位置&pb+i
是参数pb
加上i
的值的内存位置。它们是不同的变量,所以它们在内存中有不同的位置。啊,真正的问题是比较点
的地址和pb
的地址
尝试使用point+i
(或&point[i]
)和pb+i
(或&pb[i]
)。我相信您会得到预期的答案
如果您好奇的话,
&point+i
是局部变量point
加上i
的值的内存位置&pb+i是参数pb
加上i
的值的内存位置。它们是不同的变量,所以它们在内存中有不同的位置。啊,真正的问题是比较点
的地址和pb
的地址
尝试使用point+i
(或&point[i]
)和pb+i
(或&pb[i]
)。我相信您会得到预期的答案
如果您好奇的话,
&point+i
是局部变量point
加上i
的值的内存位置&pb+i是参数pb
加上i
的值的内存位置。它们是不同的变量,所以它们在内存中有不同的位置。啊,真正的问题是比较点
的地址和pb
的地址
尝试使用point+i
(或&point[i]
)和pb+i
(或&pb[i]
)。我相信您会得到预期的答案
如果您好奇的话,
&point+i
是局部变量point
加上i
的值的内存位置&pb+i是参数pb
加上i
的值的内存位置。它们是不同的变量,所以它们在内存中有不同的位置。因为您打印(指针地址)+i:
要打印指针+i:
printf("%04x\n",&point+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
printf("%04x\n",point+i);
printf("%d\t %04x\n",*pb+i,pb+i);
还有一个bug:
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);
因为您打印(指针地址)+i:
要打印指针+i:
printf("%04x\n",&point+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
printf("%04x\n",point+i);
printf("%d\t %04x\n",*pb+i,pb+i);
还有一个bug:
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);
因为您打印(指针地址)+i:
要打印指针+i:
printf("%04x\n",&point+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
printf("%04x\n",point+i);
printf("%d\t %04x\n",*pb+i,pb+i);
还有一个bug:
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);
因为您打印(指针地址)+i:
要打印指针+i:
printf("%04x\n",&point+i);
printf("%d\t %04x\n",*pb+i,&pb+i);
printf("%04x\n",point+i);
printf("%d\t %04x\n",*pb+i,pb+i);
还有一个bug:
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);
point存储数组a的地址。&point打印点的地址并通过循环添加4。与&pb的情况相同。28fee8是存储点的位置,28fed4是存储pb的位置。point存储数组a的地址。&point打印点的地址并通过循环添加4。c也是一样带&pb的ase.28fee8是存储点的位置,28fed4是存储pb的位置。点存储数组a的地址。&point打印点的地址并在循环中添加4。与带&pb的情况相同。28fee8是存储点的位置,28fed4是存储pb的位置。点存储数组a的地址。&point打印点的地址并在循环中加4。与&pb的情况相同。28fee8是存储点的位置,28fed4是存储pb的位置。为什么不写这个
*(pb+i)=*(pa+i);
这样pb[i]=pa[i]
你对scanf(%d\n,&a[i])有什么期望?
scanf(%d,&a[i]);
为什么不写这个*(pb+i)=*(pa+i)
这样pb[i]=pa[i];
你对点+i(%d\n,&a[i]有什么期望
为什么不写这个*(pb+i)=*(pa+i);
这样pb[i]=pa[i];
?你对&point+i
有什么期待