一顿子说清楚c++关于函数参数传递类型的问题

一顿子说清楚c++关于函数参数传递类型的问题

当开始接触c++的时候,总是傻傻地分不清函数传递类型的问题,感觉不如java、golang那么容易懂,主要还是因为java没有指针,只有引用,而golang是弱化版的指针,而c++指针和引用都有的,总是让人感觉糊里糊涂的。现在来一顿子说清楚关于c++函数传参类型的之间的关系。

1、值传递

在值传递中,函数参数接受的是实参的副本,而不是实际的变量本身,这意味着函数内部对参数的修改的修改不会影响到原始的实参。这种传递方式适用于简单的数据类型,例如整数、浮点型等。在函数内部修改参数不会影响到调用者。

void modifyValue(int x) {
    x = 10;  // 修改局部副本
}

int main() {
    int num = 5;
    modifyValue(num);
    // num的值仍然是5,因为值传递不影响原始变量
    return 0;
}

2、引用传递

通过引用传递函数参数,函数接收的是实参的引用(内存地址),而不是副本。这允许函数内部对参数的修改会反映在原始的实参上。引用传递适用于需要在函数内部修改实参值的情况,也可以避免不必要的内存拷贝。

void modifyReference(int &x) {
    x = 10;  // 修改原始变量
}

int main() {
    int num = 5;
    modifyReference(num);
    // num的值现在是10,因为引用传递修改了原始变量
    return 0;
}

3、指针传递

指针传递和引用传递在许多方面类似,传递的实参的内存地址,但使用了不同的语法。通过指针传递,函数可以修改指针所指向的数据。

void modifyPointer(int *ptr) {
    *ptr = 10;  // 修改指向的值
}

int main() {
    int num = 5;
    int *ptr = #
    modifyPointer(ptr);
    // num的值现在是10,因为指针传递修改了原始变量
    return 0;
}

4、常量传递

将参数声明为const,可以确保函数内部不能修改参数的值。这样有助于编写更加安全和可预测的代码,特别是在值传递和指针传递中。

void printValue(const int x) {
    // x = 10;  // 编译错误,不能修改常量参数的值
    std::cout << x << std::endl;
}

int main() {
    int num = 5;
    printValue(num);
    return 0;
}

那当传入的参数为const char *,表示一个指向常量字符的指针。这种类型的参数常常用于表示字符串,而且函数在这种情况下通常只是读取字符串,而不会修改它。

#include 

void printString(const char *str) {
    std::cout << str << std::endl;
}

int main() {
    const char *message = "Hello, World!";
    printString(message);  // 输出:Hello, World!
    return 0;
}

在上述的这个例子中,printString函数接收一个指向常量字符的指针作为参数。这意味着函数内部不能修改字符串的内容。这是因为函数声明中使用了const,表示参数指向的字符数据是只读的。

注意,虽然参数为const char *,但这并不意味着传递给函数的字符串本身是不可修改的。参数的类型只表明函数不会修改通过指针访问的字符串内容,但是可以通过其他方式修改原始字符串。例如:

int main() {
    char message[] = "Hello, World!";
    printString(message);  // 输出:Hello, World!
    
    message[0] = 'h';  // 修改原始字符串,现在变为 "hello, World!"
    printString(message);  // 输出:hello, World!
    
    return 0;
}

总之,const char *参数通常用于表示只读字符串,在函数内部不会修改字符串内容。如果你希望函数能修改字符串,可以传递char *类型的参数。如果函数不仅需要读取字符串还有修改它,可以使用char *参数,但是需要小心确保不会越界访问或者修改非预期的内存。

在c++中,将参数声明为const char *意味着函数不会修改通过指针指向的字符数据。这是一种编译器保护,可以防止在函数内部无意中修改传递的字符串。因此,通常不应该省略const,除非有确切的理由。

你可能感兴趣的:(C++学习,c++)