MST

星途 面试题库

面试题:C++ 函数参数传递中的指针与常量指针

在C++函数参数传递时,若使用指针作为参数,和使用常量指针作为参数,在函数的实现和调用上会有哪些不同?请结合代码说明如何正确使用这两种方式来实现不同的功能需求,例如函数既需要修改传入对象的值,又要保证某些数据不被修改。
28.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 指针作为参数
    • 函数实现:指针作为参数,函数内部可以通过指针修改所指向对象的值。
    • 代码示例
#include <iostream>
void modifyValue(int* ptr) {
    if (ptr) {
        *ptr = 10;
    }
}
int main() {
    int num = 5;
    modifyValue(&num);
    std::cout << "The value of num after modification: " << num << std::endl;
    return 0;
}
  • 调用方式:在调用函数时,传递对象的地址。这种方式适用于需要修改传入对象值的场景。
  1. 常量指针作为参数
    • 函数实现:常量指针作为参数,指针本身可以改变指向,但所指向的内容不能被修改。
    • 代码示例
#include <iostream>
void printValue(const int* ptr) {
    if (ptr) {
        std::cout << "The value is: " << *ptr << std::endl;
    }
}
int main() {
    int num1 = 5;
    int num2 = 10;
    const int* constPtr = &num1;
    printValue(constPtr);
    constPtr = &num2; // 合法,指针可以改变指向
    // *constPtr = 20; // 非法,不能修改所指向的值
    printValue(constPtr);
    return 0;
}
  • 调用方式:同样传递对象的地址。当函数不需要修改传入对象的值,只是读取其值时,使用常量指针作为参数可以起到保护数据不被修改的作用。
  1. 结合实现不同功能需求
    • 需求:函数既需要修改传入对象的值,又要保证某些数据不被修改。
    • 代码示例
#include <iostream>
void complexModify(int* modifiablePtr, const int* nonModifiablePtr) {
    if (modifiablePtr) {
        *modifiablePtr = *nonModifiablePtr;
    }
}
int main() {
    int numToModify = 5;
    int numToCopy = 10;
    complexModify(&numToModify, &numToCopy);
    std::cout << "The modified value: " << numToModify << std::endl;
    return 0;
}
  • 在这个示例中,modifiablePtr 用于修改值,nonModifiablePtr 保证其指向的数据不被修改,从而满足既修改传入对象的值,又保证某些数据不被修改的功能需求。