在下面两行中,
char a[5]={1,2,3,4,5};
char *ptr=(char *)(&a+1);
printf("%d",*(ptr-1));
这会在屏幕上打印 5。而当使用 a 代替 &a 时,
char a[5]={1,2,3,4,5};
char *ptr=(char *)(a+1);
printf("%d",*(ptr-1));
这打印 1
a和&a都是数组的起始地址。那么为什么会有这样的区别呢?
还
char *ptr=&a+1;
显示警告。
数组不是指针!读comp.lang.c 常见问题解答第 6 部分 http://c-faq.com/aryptr/index.html了解更多信息。
让我们首先看看你的第二种情况,因为它看起来更“正常”和惯用。逐行:
- 你声明一个数组
a
含 5char
元素。
- 数组的名称(
a
) 衰减为指向其在此上下文中的第一个元素的指针。你添加1
并将结果分配给ptr
. ptr
指向2
。尽管你有演员,但不需要演员。
- 你减去
1
from ptr
然后取消引用并打印 - 因此你得到1
.
现在,让我们再次逐行解决第一种情况:
- 你声明一个数组
a
含 5char
元素。
- 你取地址
a
,产生一个char (*)[5]
类型指针。然后你添加1
到这个指针 - 由于指针算术,这个新指针传递到紧随其后的字节5
在记忆中。然后您进行类型转换(这次是必需的)并将该值分配给ptr
.
- 你减去
1
from ptr
然后引用并打印。ptr
is a char *
,所以这个减法只是将指针从“超过末尾一”向后移动一位a
" 指向最后一个元素a
。因此你得到5
.
最后来说说原因char *ptr=&a+1;
给出警告是因为 C 需要指针类型之间的转换才能进行显式强制转换。正如刚才提到的,&a
属于类型char (*)[5]
, not char *
,因此将该值分配给char *
变量,您需要显式强制转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)