繁体   English   中英

使用数组时在C中使用指针算术

[英]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。

pchar *类型的变量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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM