有人可以帮我在 C 中运行这段代码吗?ptr 分配不清楚

问题描述 投票:0回答:2
#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

我怎么也不知道结果是怎样的

c pointers casting implicit-conversion pointer-arithmetic
2个回答
1
投票

表达式中使用的数组被隐式转换为指向其第一个元素的指针。

因此在这个表达式

*(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)
一样取消引用这个表达式你得到数组的最后一个元素。


1
投票

(char*)(&a+1)

  1. &a
    给出指向 7
    char
    元素的数组的指针(类型
    char (*)[7]
  2. +1
    给出了 next 7
    char
    元素数组的第一个元素的引用(这超出了你的数组)
  3. (char *)
    将其转换为指向
    char
    的指针。
  4. ptr-1
    引用
    a
    数组的最后一个元素(因为 ptr 引用对象
    char
    超过
    a
    数组
© www.soinside.com 2019 - 2024. All rights reserved.