【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 //理由同上




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值