📅  最后修改于: 2023-12-03 15:30:15.286000             🧑  作者: Mango
这是一道关于C语言的问题。该问题主要涉及指针和数组的概念。下面给出问题说明和解答。
有下面这些定义:
int a[] = {0, 1, 2, 3, 4};
int *p1 = (int*)(&a+1);
int *p2 = (int*)((int)a+1);
请问以下表达式的值是多少:
printf("%d,%d\n", p1[-1], *p2);
表达式 p1
的值是指向数组 a 下一个内存地址的指针,由于每个 int
结构体的大小是 4 字节,所以 p1
指向的是数组 a 结尾后的 4 个字节。因此,表达式 p1[-1]
将访问 a 数组的最后一个元素。因此他的值为 4
。
表达式 p2
指向 a 数组的第一个元素的下一个地址。在32位环境中,int
结构体大小是4字节。因此,加1之后,指针地址向后偏移了4字节。此时 p2
指向的是 a[0] 的第一个字节的下一个字节。因此,*p2
访问的是该内存位置的值,即 1
。
因此,上述语句的输出为:4,1
。
本问题并不涉及C高级特性,主要考察指针算术运算以及对数组地址的理解。对于 C 语言的初学者,理解这些概念可能有些困难。但是,一旦你理解了指针和地址这些概念,这些细节问题将会变得非常容易解决。