MST

星途 面试题库

面试题:C++按值传递在基础数据类型与自定义结构体中的表现差异

请分别阐述C++中按值传递在int、float等基础数据类型和自定义结构体类型上的表现,并通过代码示例展示两者在函数调用过程中,形参和实参之间的数据传递和内存变化情况。
42.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 基础数据类型(以int为例)
    • 表现:按值传递时,函数接收的是实参值的一个副本。对形参的任何修改都不会影响实参。
    • 代码示例
#include <iostream>

void modifyInt(int num) {
    num = num + 1;
}

int main() {
    int a = 5;
    std::cout << "Before function call, a = " << a << std::endl;
    modifyInt(a);
    std::cout << "After function call, a = " << a << std::endl;
    return 0;
}
  • 内存变化:在main函数中,a有自己的内存空间存储值5。当调用modifyInt(a)时,系统为形参num分配新的内存空间,并将a的值复制到num的内存中。在modifyInt函数中修改num,只是修改了num所在内存的值,而a的内存值未改变。
  1. 自定义结构体类型
    • 表现:同样按值传递,函数接收结构体实参的一个副本。对形参结构体的修改不会影响实参结构体。
    • 代码示例
#include <iostream>

struct Point {
    int x;
    int y;
};

void modifyPoint(Point p) {
    p.x = p.x + 1;
    p.y = p.y + 1;
}

int main() {
    Point myPoint = {1, 2};
    std::cout << "Before function call, myPoint.x = " << myPoint.x << ", myPoint.y = " << myPoint.y << std::endl;
    modifyPoint(myPoint);
    std::cout << "After function call, myPoint.x = " << myPoint.x << ", myPoint.y = " << myPoint.y << std::endl;
    return 0;
}
  • 内存变化:在main函数中,myPoint结构体有其对应的内存空间存储xy的值。当调用modifyPoint(myPoint)时,系统为形参p分配新的内存空间,并将myPoint结构体的内容逐字段复制到p的内存中。在modifyPoint函数中修改pxy,只是修改了p所在内存的值,而myPoint的内存值未改变。