【发布时间】:2021-06-14 09:27:08
【问题描述】:
面试官问我下面的C程序会输出什么
int a[5] = {1,2,3,4,5};
int *prt = (int*) (&a+1);
printf("%d %d", *(a+1), *(prt-1));
打印出来的
2 5
我对第二个数字的回答是错误的。我意识到我并不真正理解指向数组的指针(它已经是指向数组第一个元素的指针)发生了什么。 *ptr 到底在这里做什么?
【问题讨论】:
-
&a不是指向int的指针,而是指向数组int[5]的指针。如果将+1添加到这样的指针,您将前进到数组而不是第一个元素。因此需要-1以避免在数组之后访问非法内存。 -
int *prt = (int*) (&a+1);最好写成int *prt = *(&a+1);。 -
@mch:
*(&a+1)未由 C 标准定义。该标准仅出于指针算术的目的(C 2018 6.5.6)为“超出”对象的指针赋予含义。根据 C 2018 6.5.3.2,*的操作数必须指向实际的对象或函数,而不仅仅是具有“指向对象的指针”或“指向函数的指针”的类型。(int*) (&a+1)和*(&a+1)都不是 C 标准定义的。
标签: c implicit-conversion pointer-arithmetic