[英]pointer arithmetic in C while working with array
情况1:
#include <stdio.h>
int main()
{
int arr[3] = {2,3,4};
char *p;
p = (char*) arr;
printf(" %p - %d\n",&p, *p);
p = p+1;
printf("%p - %d\n",&p, *p);
return 0;
}
输出:
0x7ffde540b000 - 2
0x7ffde540b000 - 0
在上面的代码中,指针“ p”的值增加了1-但地址没有改变。
我再次将p的值增加了4(即p = p + 4)。 这次我得到以下输出-
0x7ffe50a2dff0 - 2
0x7ffe50a2dff0 - 3
指针移动到位置arr [1]并输出正确的值。
但地址没有改变。
情况2:
现在重写上面的代码(从打印语句中删除“&”)
printf(" %p - %d\n", p, *p);
p = p+1;
printf(" %p - %d\n", p, *p);
输出-
0x7ffdb20b9d1c - 2
0x7ffdb20b9d1d - 0
地址更改为1。
同样,当我用p = p + 4更新代码时,它可以正常工作;
输出-
0x7ffef8735d6c - 2
0x7ffef8735d70 - 3
地址增加了4。
当我在打印语句中使用“&”时(情况一),我不明白为什么地址没有更改。
在这种情况下,“&p”和“ p”之间有什么区别。
操作系统是Kubuntu和编译器GCC。
p
是char *
类型的变量char *
作为char *
变量p
包含代表字符指针的值。
&p
是此变量p
存储在内存中的地址。
当您编写p = p + 1
您将更改变量p
的值。 但是变量p
是相同的变量,存储在相同的内存中,因此&p
自然不会改变。
c中的&运算符为您提供存储值的地址。 因此,使用&p
可以获取存储p
的地址,而不是p
指向的地址。 这就是为什么您的第一种情况的地址没有变化的原因。 情况2:您删除了&
因此获得了地址的值,其中p
一旦增加p
便会更改。
我希望这现在很清楚:)
问题不在于您在做什么,而在于您如何打印数据。
int arr[3] = {2,3,4};
char *p = (char *) arr;
printf(" %p - %d\n", p, *p);
p = p+1;
printf("%p - %d\n", p, *p);
如果仅用p
代替&p
的幻影,那么您将获得预期的结果。 问题是&
被读为“获取地址”,因此&p
将返回存储char * p
的地址,并且永远不变!
int arr[3] = {2,3,4};
int *p = arr;
printf(" %p - %d\n", p, *p);
p = p+1;
printf("%p - %d\n", p, *p);
这就是为什么第二个代码块起作用的原因。 在这些行的上方,您实际上拥有更多意义,其中p
是一个int *
。
我建议您看一下C-Sim (免责声明:它是由我创建的),并按照教程进行操作。 C-Sim将为上面的代码绘制状态图。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.