MST

星途 面试题库

面试题:C++ 常指针与指向常变量的指针在函数参数中的应用

假设有一个函数 `void modifyData(int* data)` 用于修改传入的整数数据。现在需要修改这个函数,使其既能接收普通指针作为参数,也能接收指向常变量的指针作为参数,同时保持数据的安全性。请说明如何修改函数定义以及在函数内部需要做哪些改变,并阐述常指针在这种场景下可能引发的问题及解决办法。
30.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 修改函数定义

    • 原函数定义为 void modifyData(int* data),为了既能接收普通指针又能接收指向常变量的指针,可将函数定义修改为 void modifyData(const int* data)。这样函数可以接受 const int* 类型的指针,同时也能隐式转换接受 int* 类型的指针(因为 int* 可以转换为 const int*)。
  2. 函数内部改变

    • 由于参数现在是 const int*,在函数内部不能直接修改 *data。如果需要修改数据,一种常见的办法是先将数据复制到一个非 const 的变量中,然后对这个非 const 变量进行修改。例如:
    void modifyData(const int* data) {
        int temp = *data;
        // 对temp进行修改
        temp = temp + 1;
        // 这里如果要反馈修改后的值给调用者,可能需要其他机制,比如通过返回值或额外的非const指针参数
    }
    
  3. 常指针可能引发的问题及解决办法

    • 问题
      • 如果函数试图直接修改 const int* 指针指向的数据,会导致编译错误,因为 const 修饰的指针指向的数据是不可变的。例如,在 void modifyData(const int* data) 函数内写 *data = 5; 会编译失败。
      • 另外,如果函数需要将修改后的数据反馈给调用者,由于指针指向的是 const 数据,不能直接在原数据上修改,这可能需要额外的处理。
    • 解决办法
      • 对于不能直接修改 const 数据的问题,如前面所述,可以先将数据复制到非 const 变量进行修改。
      • 对于反馈修改后数据给调用者的问题,一种办法是通过函数返回值返回修改后的数据,例如:
      int modifyData(const int* data) {
          int temp = *data;
          temp = temp + 1;
          return temp;
      }
      
      • 另一种办法是提供一个额外的非 const 指针参数用于存储修改后的数据:
      void modifyData(const int* data, int* result) {
          int temp = *data;
          temp = temp + 1;
          *result = temp;
      }