鱼C论坛

 找回密码
 立即注册
查看: 879|回复: 5

[已解决]参数

[复制链接]
发表于 2021-12-19 10:17:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>

using namespace std;

void print(const char (&p) [3]) {
        for (auto c : p)
                cout << c;
}

int main(void)
{
    print("ab");
}

在书上看到这样的参数  const char (&p) [3] ,不懂它表达的意思,大概能知道它是类型转化,把字符串转成数组,但是前面为什么一定要加一个const 啊,希望大佬帮忙讲解一下。
最佳答案
2021-12-19 12:27:52
梦回连营 发表于 2021-12-19 11:22
能解释一下这之间的机制问题吗
先说声抱歉,因为我不擅长解说长篇大论,如果还是不明白,请自行上网爬文

以你的代码有两点必须注意:
1.)首先以 C 语言为例:
你要先知道以下两种字符串的区别:
char A[] = "ab";
char *B = "ab";
以上两种都能在 C 里正常运作,没有问题,但是在 C++ 11 里肯定报错,为什么呢?
C++ 11 报错:warning: ISO C++ forbids converting a string constant to ‘char*’

明显看出关键字 constant 吧?一个是能修改字符串,一个是不能修改的字符串。而 C++ 对于这点非常敏感,必须改写成:
char A[] = "ab";
char *B = (char*)"ab";

2.)参数 &符
举例:
#include <iostream>
// using namespace std;

void print_A(int x){
    std::cout << x << std::endl;
}

void print_B(int &x){
    std::cout << x << std::endl;
}

int main()
{
    int num = 13;
    print_A(num);
    print_B(num);
    return 0;
}
输出结果:
13
13
可以看出以上两点输出结果相同,那么为什么又要加个 & 符呢?
参数.jpg
如图:第一点,附加 & 符表示只是用作参考,而不加 & 表示用作值。其它特征请自行百度查阅,这里不多讲
所谓参考参数就是可以直接修改参数值,比如:
#include <iostream>
// using namespace std;

void A(int &x){ // &x 为参考参数
    x = 9999;
}

void B(int x){ // 一般参数
    x = 9999;
}

int main()
{
    int a = 13, b = 7; // 声明与定义变量
    
    A(a); // 调用函数 A,a 值已经改变,此时 a = 9999
    B(b); // 调用函数 B,b 值没有改变,此时 b = 7(保持原样)
    
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    
    return 0;
}
输出结果:
9999
7
可以看出,参考参数在函数内部做变动,会直接影响外部变量值。

针对以上两点,可以看出你的这个函数参数限制蛮多的:
1.)必须是常量字符串(不能做任何变动更改)
2.)参数作为参考参数(变动改变其值会直接影响函数外部变量值)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-19 10:36:44 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2021-12-19 10:40 编辑

表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值),而且传入字符串也必须是常量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-19 10:39:58 | 显示全部楼层
傻眼貓咪 发表于 2021-12-19 10:36
表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值)

我把const去掉的话, 编译会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-19 10:42:32 | 显示全部楼层
梦回连营 发表于 2021-12-19 10:39
我把const去掉的话, 编译会报错

如果想去掉 const:
#include <iostream>

using namespace std;

void print( char (&p) [3]) {
        for (auto c : p)
                cout << c;
}

int main(void)
{
    char str[] = "ab";
    print(str);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-19 11:22:34 | 显示全部楼层

能解释一下这之间的机制问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-19 12:27:52 | 显示全部楼层    本楼为最佳答案   
梦回连营 发表于 2021-12-19 11:22
能解释一下这之间的机制问题吗
先说声抱歉,因为我不擅长解说长篇大论,如果还是不明白,请自行上网爬文

以你的代码有两点必须注意:
1.)首先以 C 语言为例:
你要先知道以下两种字符串的区别:
char A[] = "ab";
char *B = "ab";
以上两种都能在 C 里正常运作,没有问题,但是在 C++ 11 里肯定报错,为什么呢?
C++ 11 报错:warning: ISO C++ forbids converting a string constant to ‘char*’

明显看出关键字 constant 吧?一个是能修改字符串,一个是不能修改的字符串。而 C++ 对于这点非常敏感,必须改写成:
char A[] = "ab";
char *B = (char*)"ab";

2.)参数 &符
举例:
#include <iostream>
// using namespace std;

void print_A(int x){
    std::cout << x << std::endl;
}

void print_B(int &x){
    std::cout << x << std::endl;
}

int main()
{
    int num = 13;
    print_A(num);
    print_B(num);
    return 0;
}
输出结果:
13
13
可以看出以上两点输出结果相同,那么为什么又要加个 & 符呢?
参数.jpg
如图:第一点,附加 & 符表示只是用作参考,而不加 & 表示用作值。其它特征请自行百度查阅,这里不多讲
所谓参考参数就是可以直接修改参数值,比如:
#include <iostream>
// using namespace std;

void A(int &x){ // &x 为参考参数
    x = 9999;
}

void B(int x){ // 一般参数
    x = 9999;
}

int main()
{
    int a = 13, b = 7; // 声明与定义变量
    
    A(a); // 调用函数 A,a 值已经改变,此时 a = 9999
    B(b); // 调用函数 B,b 值没有改变,此时 b = 7(保持原样)
    
    std::cout << a << std::endl;
    std::cout << b << std::endl;
    
    return 0;
}
输出结果:
9999
7
可以看出,参考参数在函数内部做变动,会直接影响外部变量值。

针对以上两点,可以看出你的这个函数参数限制蛮多的:
1.)必须是常量字符串(不能做任何变动更改)
2.)参数作为参考参数(变动改变其值会直接影响函数外部变量值)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-9 17:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表