面试题答案
一键面试-
- 是否为左值及原因:
*(*q + 2)
是左值。原因如下:int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; int **q = &p;
这里q
是指向指针p
的指针,*q
等价于p
,*q + 2
表示p
向后偏移2个int
指针大小的位置,而*(*q + 2)
就等价于*(p + 2)
,也就是arr[2]
。数组元素是可以被赋值的,所以它是左值。
- 赋值举例:
- 是否为左值及原因:
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
int **q = &p;
*(*q + 2)=10;
for(int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
return 0;
}
上述代码将 *(*q + 2)
赋值为10,即 arr[2]
被赋值为10,然后输出整个数组,可以看到 arr[2]
的值发生了改变。
2. 多层指针间接访问过程中左值特性的传递规则:
- 在多层指针间接访问中,若最终的间接访问结果指向一个可修改的内存位置(如数组元素、变量等),那么它就是左值。例如,对于
int **q
,*q
指向一个指针p
,如果p
指向一个可修改的int
类型变量(这里p
指向数组arr
的首元素,数组元素是可修改的),那么*(*q + 2)
就是左值。如果中间某层指针指向的是一个常量(如const int *p
),那么后续基于该指针的间接访问得到的就不是左值,因为常量不能被修改。左值特性的传递取决于每一层指针所指向的对象是否可写,如果某一层指向不可写对象,那么后续间接访问结果通常不是左值。