MST

星途 面试题库

面试题:C语言指针间接访问复杂场景下的左值分析

给定代码段:int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; int **q = &p; 1. 分析*(*q + 2)是否为左值,如果是,说明原因并举例如何对其赋值;如果不是,阐述为什么。2. 解释在多层指针间接访问过程中左值特性的传递规则。
47.0万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
    • 是否为左值及原因
      • *(*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),那么后续基于该指针的间接访问得到的就不是左值,因为常量不能被修改。左值特性的传递取决于每一层指针所指向的对象是否可写,如果某一层指向不可写对象,那么后续间接访问结果通常不是左值。