#include <stdio.h>
int main()
{
char a[]={1,2,3,4,5,6,7};
char *ptr =(char*)(&a+1);
printf("%d %d \n",*(a+1),*(ptr-1));
return 0;
}
输出是:2 7
我怎么也不知道结果是怎样的
表达式中使用的数组被隐式转换为指向其第一个元素的指针。
因此在这个表达式
*(a+1)
中,数组指示符 a
被转换为指向其第一个元素的 char *
类型的指针,而表达式 a + 1
指向数组的第二个元素。像 (a+1)
一样取消引用指针表达式 *(a+1)
你得到数组的第二个元素,实际上表达式 *(a+1) 与表达式 a[1]
相同。
这个表达式
&a
有指针类型 char ( * )[7]
指向整个数组 a char[7]
.
这个表达式
(&a+1)
指向数组最后一个元素之后的内存并且具有相同的类型char ( * )[7]
。该指针表达式被转换为类型char *
.
char *ptr =(char*)(&a+1);
所以指针p指向数组a最后一个元素之后的内存。
表达式
ptr-1
指向数组的最后一个元素并像 *(ptr-1)
一样取消引用这个表达式你得到数组的最后一个元素。
(char*)(&a+1)
:
&a
给出指向 7 char
元素的数组的指针(类型 char (*)[7]
)+1
给出了 next 7 char
元素数组的第一个元素的引用(这超出了你的数组)(char *)
将其转换为指向 char
的指针。ptr-1
引用 a
数组的最后一个元素(因为 ptr 引用对象 char
超过 a
数组