鱼C论坛

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

[已解决]参数

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

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

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

x
  1. #include <iostream>

  2. using namespace std;

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

  7. int main(void)
  8. {
  9.     print("ab");
  10. }
复制代码


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

以你的代码有两点必须注意:
1.)首先以 C 语言为例:
你要先知道以下两种字符串的区别:
  1. char A[] = "ab";
  2. char *B = "ab";
复制代码

以上两种都能在 C 里正常运作,没有问题,但是在 C++ 11 里肯定报错,为什么呢?
C++ 11 报错:warning: ISO C++ forbids converting a string constant to ‘char*’

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


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

  3. void print_A(int x){
  4.     std::cout << x << std::endl;
  5. }

  6. void print_B(int &x){
  7.     std::cout << x << std::endl;
  8. }

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

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

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

  9. int main()
  10. {
  11.     int a = 13, b = 7; // 声明与定义变量
  12.    
  13.     A(a); // 调用函数 A,a 值已经改变,此时 a = 9999
  14.     B(b); // 调用函数 B,b 值没有改变,此时 b = 7(保持原样)
  15.    
  16.     std::cout << a << std::endl;
  17.     std::cout << b << std::endl;
  18.    
  19.     return 0;
  20. }
复制代码
输出结果:
  1. 9999
  2. 7
复制代码
可以看出,参考参数在函数内部做变动,会直接影响外部变量值。

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

使用道具 举报

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

表示不能更改传入的参数值(以你的代码为例,只打印,不作更改值),而且传入字符串也必须是常量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我把const去掉的话, 编译会报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  2. using namespace std;

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

  7. int main(void)
  8. {
  9.     char str[] = "ab";
  10.     print(str);
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

能解释一下这之间的机制问题吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

以你的代码有两点必须注意:
1.)首先以 C 语言为例:
你要先知道以下两种字符串的区别:
  1. char A[] = "ab";
  2. char *B = "ab";
复制代码

以上两种都能在 C 里正常运作,没有问题,但是在 C++ 11 里肯定报错,为什么呢?
C++ 11 报错:warning: ISO C++ forbids converting a string constant to ‘char*’

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


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

  3. void print_A(int x){
  4.     std::cout << x << std::endl;
  5. }

  6. void print_B(int &x){
  7.     std::cout << x << std::endl;
  8. }

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

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

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

  9. int main()
  10. {
  11.     int a = 13, b = 7; // 声明与定义变量
  12.    
  13.     A(a); // 调用函数 A,a 值已经改变,此时 a = 9999
  14.     B(b); // 调用函数 B,b 值没有改变,此时 b = 7(保持原样)
  15.    
  16.     std::cout << a << std::endl;
  17.     std::cout << b << std::endl;
  18.    
  19.     return 0;
  20. }
复制代码
输出结果:
  1. 9999
  2. 7
复制代码
可以看出,参考参数在函数内部做变动,会直接影响外部变量值。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 13:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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