zoukankan      html  css  js  c++  java
  • 【C++ primer】第七章 函数C++的编程模块

    1,函数的基本知识

           C++对于返回值的类型有一定的限制:不能是数组,但可以使其他任何类型,甚至可以使结构和对象。

           有趣的是,虽然数组不可以作为返回对象,但是数组可以作为结构或对象组成部分来返回。

    2,函数参数和按值传递

           cin.get();//读取所有输入的字符,包括空格和换行符。

           cin>> ;//跳过空格和换行符读取。

    3,函数和数组

           int  arr[32];

           int  sum_arr(int arr[],int n);//参数arr是一个指针,而不是一个数组。

           int  sum_arr(int *arr,int n);  //仅用于函数头,函数原型中 int  *arr 跟  int arr[]的含义相同

            恒等式:

                   arr[i] ==  *(arr+i);  //值

                   &arr[i] == arr+i;    //地址

    4,数组名和指针对应的好处?

              节省赋值整个数组所需的时间和内存

              使用原始数据增加了破坏数据的风险

    5,为什么需要传递数组长度?

             不能通过sizeof(arr) 计算数组的长度。原因是sizeof(arr)只是指针变量的值。

    6,重要的问题:在C语言中“&”的妙用

           在C++程序声明变量的时候的&,只是表明“它是一个引用,这个引用声明时不开辟新空间,它在内存分配表加入新的一行,该行内存地址等于和调用时传入的对应参数内存地址”

           例子:

    #include "stdio.h"
    
    void inc(int *data)
    {
    	(*data)++;
    } 
    int main()
    {
    	int a=0;
    	inc(&a); //调用是关键
    	printf("%d\n",a);
    	return 0 ;
    }
    
    #include"stdio.h"
    #include"malloc.h"
    #include"string.h"
    void TestFunction(char** ptr1, char*& ptr2)
    {
      *ptr1 = "abc";
       ptr2 = (char*)malloc(6);
       strcpy(ptr2, "abc");
    }
    
    int main()
    {
     char* ptr1 = NULL, *ptr2 = NULL;
     TestFunction(&ptr1, ptr2);
     printf("%s\n", ptr1);
     printf("%s\n", ptr2);
     free(ptr2);
    }

    7,指针和const

        1)指针指向一个常量对象:int age=39;

                 const   int  *pt=&age;

                 防止使用该指针来修改所指向的值。  不能用(*pt)++修改变量的值。但可以通过修改 age的值来更改 指针指向的值

                 pt可以指向另一个变量。

        2)指针本身声明为常量:int  *const  pt;

                 pt可以用来修改值,pt不能指向其他变量。

    【注意】C++禁止将const的地址赋给非const指针。

                   常量不能作为形参传递给非常量函数。

    8,函数和C-风格字符串

           1)字符串作为参数来传递,实际传递的是字符串的第一个字符的地址。

           2)字符串内置结束符“/0”而字符数组没有

           3)函数无法返回字符串,但可以返回字符串的地址。

    9,函数和结构、String对象

           1)函数可以返回结构,但是结构名只是名称,而不像数组名代表地址。要想获取地址只能使用地址操作符"&"

           2)String 对象采用 getline(cin,str[i]);实例:     

    #include <iostream>
    #include <string>
    using namespace std;
    
    void display(const string s[],int n)
    {
    	for(int i=0;i<n;i++)
    	   cout<<i+1<<":"<<s[i]<<endl;
    }
    int main()
    {
    	string list[3];
    	for(int i=0;i<3;i++)
    	  getline(cin,list[i]);
    	  
    	display(list,3);
    }
    10,函数指针

            1)原理:将函数的地址当做参数传递给相应函数

            2)测试源码:

    #include <iostream>
    using namespace std;
    double besy(int lns)
    {
    	return 0.05*lns;
    }
    double estimate(int lines,double (*pf)(int))//第二个形参含义为函数声明 double pm(int data)
                                               //只不过将函数名 pm替换成了 (*pf) 
                                                //pf 是一个指向函数的指针 
    {
    	cout<<lines<<"lines will take\n";	
    	cout<<(*pf)(lines)<<" hour (s)\n";
    		
    }
    int main()
    {
    	/*执行过程讲解:
    	  函数实参为 lines=16   besy(lines=16) 
        */
    	estimate(16,besy);
    	
    } 
    
    11,总结

         1)默认情况下,C++函数按值传递参数。意味着形参是新的变量,他们被初始化为函数调用所提供的值。因此C++通过使用拷贝,保护了原始数据的完整性。
         2)使用函数的三个步骤:定义函数、提供原型、调用函数

         3)*"tianshuai"表示的含义:t        //"tianshuai"被解析为字符数组第一个元素的地址。而加上*表示取的一个元素的值

                "tianshuai"[2] 表示 第三个元素 a    //理由同上




  • 相关阅读:
    leetcode701. Insert into a Binary Search Tree
    leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes
    leetcode 110. Balanced Binary Tree
    leetcode 104. Maximum Depth of Binary Tree 111. Minimum Depth of Binary Tree
    二叉树
    leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
    5. Longest Palindromic Substring
    128. Longest Consecutive Sequence
    Mac OS下Android Studio的Java not found问题,androidfound
    安卓 AsyncHttpClient
  • 原文地址:https://www.cnblogs.com/secbook/p/2655049.html
Copyright © 2011-2022 走看看