c - 数组a和&a的起始地址

标签 c pointers

下面两行,

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都是数组的起始地址,为什么会这样呢

还有 字符 *ptr=&a+1;

显示警告。

最佳答案

数组不是指针!阅读section 6 of the comp.lang.c FAQ获取更多信息。

让我们先看看你的第二个案例,因为它看起来更“正常”和惯用。一行一行:

  1. 您声明一个包含 5 个 char 元素的数组 a
  2. 数组的名称 (a) 在此上下文中衰减为指向其第一个元素的指针。您将 1 添加到它并将结果分配给 ptrptr 指向2。不需要强制转换,尽管你有一个。
  3. 您从 ptr 中减去 1,然后取消引用并打印 - 因此您得到 1

现在,让我们逐行处理第一种情况:

  1. 您声明一个包含 5 个 char 元素的数组 a
  2. 您获取a 的地址,产生一个char (*)[5] 类型的指针。然后,您将 1 添加到该指针 - 由于指针算法,该新指针将传递到内存中 5 之后的字节。然后您进行类型转换(这次是必需的)并将此值分配给 ptr
  3. ptr 中减去1,然后引用并打印。 ptr 是一个 char *,所以这个减法只是将指针从“a 末尾后一位”向后移动一位以指向a 的最后一个元素。因此你得到了 5

最后,char *ptr=&a+1; 给出警告的原因是因为 C 需要指针类型之间的转换才能进行显式转换。如前所述,&achar(*)[5]类型,不是char *,所以要将该值分配给 char * 变量,您将需要显式转换。

关于c - 数组a和&a的起始地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16312299/

相关文章:

c++ - 谁需要八进制表示?

c - gdb 就像打印指向结构的指针

c# - 从 C# 客户端向 C 服务器发送消息

c - 在c中插入单链表

c++ - 难以理解 C++ 指针语法

c - C中sizeof计算char a[]和char *a有什么区别?

对 BSP_LCD_Init 的调用永远不会返回。卡在 HAL_DSI_shortwrite 中

c - '!!' 是 C 中的现有运算符吗?

c - 指针相等是否意味着整数相等?

c - 数组元素乘法的二叉树方法