zoukankan      html  css  js  c++  java
  • 函数参数

    • 类似于局部变量,函数的形参为函数提供了已命名的局部存储空间
    • 函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针
    • 每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。
      形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型(第 2.5 节),则它只是实参的别名
    • 在 C 语言中,具有 const 形参或非 const 形参的函数并无区别
    • 复制庞大而复杂的值有昂贵的开销,为了避免传递副本的开销,可将形参指定为引用类型
    • 利用 const 引用避免复制
    • 应该将不修改相应实参的形参定义为 const 引用,如果将这样的形参定义为非 const 引用,则毫无必要地限制了该函数的使用(const变量不能作为参数传给非cosnt引用的形参)
      1 string func(const string &s)
      2 {
      3     return s;
      4 }
      5 int main()
      6 {
      7     cout << func("ddd");
      8     return 0;
      9 }

      如果将func形参定义为非const,则字符串常量不能作为实参传入

    • 传递指向指针的引用

      1 int *&v1
      2 //v1 是一个引用,与指向 int 型对象的指针相关联
    • 通常,函数不应该有 vector 或其他标准库容器类型的形参。调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素 。从避免复制 vector 的角度出发,应考虑将形参声明为引用类型。然而,看过第十一章后我们会知道,事实上,C++ 程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器
       1 #include <iostream>
       2 #include <vector>
       3 using namespace std;
       4 void print_(vector<int>::iterator it1, vector<int>::iterator it2)
       5 {
       6     for(vector<int>::iterator it = it1; it != it2; ++it)
       7     {
       8         cout << *it << ' ';
       9     }
      10     cout << endl;
      11 }
      12 int main()
      13 {
      14     vector<int> v(10);
      15     print_(v.begin(), v.end());
      16     return 0;
      17 }

    • 数组形参

      1 // three equivalent definitions of printValues
      2 void printValues(int*) { /* ... */ }
      3 void printValues(int[]) { /* ... */ }
      4 void printValues(int[10]) { /* ... */ } //编译器忽略为任何数组形参指定的长度。
      当编译器检查数组形参关联的实参时,(非引用传参情况下)它只会检查实参是不是指针、指针的类型和数组元素的类型时是否匹配,而不会检查数组的长度
    • 不需要修改数组形参的元素时,函数应该将形参定义为指向 const 对象的指针
    • 通过引用传递数组
      如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。 编译器检查数组的实参的大小与形参的大小是否匹配
    • 只严格地接受含有 10 个 int 型数值的数组
       1 #include <iostream>
       2 #include <vector>
       3 using namespace std;
       4 void print_(int (&a)[10]) //&arr 两边的圆括号是必需的,因为下标操作符具有更高的优先 
       5 {
       6     for(int i = 0; i<10; ++i)
       7         cout << a[i] << ' ';
       8     cout << endl;
       9 }
      10 int main()
      11 {
      12     int a[10]{0};
      13     print_(a);
      14     print_(a);
      15     return 0;
      16 }
      //把a大小改为11时,不能通过编译
    • 多维数组的传递
       1 #include <iostream>
       2 #include <vector>
       3 using namespace std;
       4 void print_(int (*a)[10])// void print_(int a[][10]), 
       5 {
       6     for(int i = 0; i<2; ++i)
       7         for(int j = 0; j<10; ++j)
       8             cout << a[i][j] <<endl;
       9 }
      10 int main()
      11 {
      12     int a[10][10]={};
      13     a[0][7] = 32;
      14     print_(a);
      15     return 0;
      16 }

    • 可以通过传递指向数组第一个和最后一个元素的下一个位置的指针来传参

    •  1 // const int ia[] is equivalent to const int* ia
       2 // size is passed explicitly and used to control access to elements of ia
       3 #include <iostream>
       4 using namespace std;
       5 void printValues(const int ia[], size_t size)
       6 {
       7    for (size_t i = 0; i != size; ++i) {
       8      cout << ia[i] << endl;
       9    }
      10 }
      11 int main()
      12 {
      13      int j[] = { 0, 1 }; // int array of size 2
      14      printValues(j, sizeof(j)/sizeof(*j));
      15      return 0;
      16 }
    • 当函数需要处理数组且函数体不依赖于数组的长度时应使用指针形参,其他情况下应使用引用形参
    • main函数参
       1 // const int ia[] is equivalent to const int* ia
       2 // size is passed explicitly and used to control access to elements of ia
       3 #include <iostream>
       4 using namespace std;
       5 int main(int argc, char *argv[])
       6 {
       7     for(int i=0; i<argc; ++i)//argc表示字符串个数
       8         cout << argv[i] << endl;
       9     return 0;
      10 }
    • 1 #include <iostream>
      2 #include <cstdlib>
      3 using namespace std;
      4 int main(int argc, char *argv[])
      5 {
      6        cout << atoi(argv[1]) + atoi(argv[2]) <<endl;
      7     return 0;
      8 }



    • 含可变参数的函数
  • 相关阅读:
    字符串指针与字符数组的区别
    为什么stc15的单片机,运行了几秒后就蹦了
    判断一个数是否是2的整数次幂
    Ubuntu下使用gcc编译c文件,未识别cos,sin
    数字图像基本处理算法
    开发板启动时,内核打印出"can't access tty,job control turned off"
    c语言里如何调用汇编里的变量?
    leetcode516 Longest Palindromic Subsequence
    leetcode523 Continuous Subarray Sum
    leetcode650 2 Keys Keyboard
  • 原文地址:https://www.cnblogs.com/2020R/p/13173316.html
Copyright © 2011-2022 走看看