数组形参
我们为函数传递一个数组时,实际传递的是这个数组的指针
void print(const int*);
void print(const int[]);//函数的意图是作用于一个数组
void print(const int[10]);
以数组作为形参的函数也必须保证这个数组不越界
使用标记指定数组长度
以C风格字符串为例,函数在遇到空字符时停止
void print(const char*cp)
{if(cp)while(*cp)cout<<*p++;
}
适合有明显结束标记且数据类型不容易混淆,比如一段文章的结尾
使用标准库规范
传递数组首元素指针与尾元素指针也是一种管理数组形参的方法
void print(const int*beg,const int*end)
{while(beg!=end)cout<<*beg++<<endl;
}//输出beg与end之间所有的元素
调用如下:
int j[2]={0,1};
print(begin(j),end(j));
第三种方法是专门定义一个表示数组大小的形参
void print(const int ia[],size_t size)//记录大小的数据类型
{for(size_t i=0;i!=size;++i)//size_t就是专门记录数据大小的数据{cout<<ia[i]<<endl;}
}
调用print函数时
int j[]={0,1};print(j,end(j)-begin(j))
C++中没有真正的多维数组
C++ 里面更严格来说其实只有数组的数组(又称jagged array),这是为什么呢?在MSDN的第CA1814号文件中找到了答案:
In a multidimensional array, each element in each dimension has the same, fixed size as the other elements in that dimension. In a jagged array, which is an array of arrays, each inner array can be of a different size. By only using the space that’s needed for a given array, no space is wasted.
翻译过来就是:
在多维数组中,每个维度中的每个元素与该维度中的其他元素具有相同的固定大小。在一个锯齿状数组(即数组的数组)中,每个内部数组可以具有不同的大小。通过只使用给定数组所需的空间,不会浪费任何空间。
C#与VB是真正支持多维数组的
main()函数
之前我们的main()函数基本为空,有时候确实需要给main()函数传递形参
int main(int argc,chat *argc[])
第一个形参表示的是数组中字符串的数量
第二个形参argv是一个数组,它的元素是指向C风格的字符串的指针
复习一下形参的作用:
它可以看成引用对象的另一个名字,不额外占用空间,效率高
在使用argv中的实参的时候,从argv[1]开始,argv[0]是给保存程序的名字
无法预知有多少个实参的时候
initializer_list形参
void error_msg(initializer_list<string> il)
{for(auto beg=i1.begin();beg!=i1.end();++beg)cout<<*beg<<" ";cout<<endl;
}
省略符形参
void foo(parm_list,...);
void foo(...);
函数的返回值
每个函数都必须有一个返回值吗?答案是否定的
- 没有return语句的函数只能用在返回类型是void的函数中,返回void的函数可以不要return函数
- 只要函数的返回类型不是void,函数就必须有一个返回值,如果没有返回值,可能导致控制流尚未返回任何值就结束了函数的执行,编译器也无法检查出这一错误
- 不要返回局部对象引用或者指针,因为函数完成后,他们的存储空间也随之释放掉
- 这条规矩有一个例外,我们允许main()函数没有return语句
左值与右值
一些语言使用左值(l-value)和右值(r-value)的概念。左值具有确定的、可以被获得的内存地址。这意味着左值可以是变量,也可以是对指向特定内存地址的指针解引用(dereference)的结果。例如C语言的表达式(4 + 9),在执行时,计算机生成一个整数值13,但因为程序没有明确指定这个13如何在计算机中存储,所以这个表达式产生一个右值。另一方面,如果一个C程序声明了一个变量x并将x赋值为13,那么表达式(x)的值是13,并且是一个左值
调用一个返回引用的函数得到左值,其他返回类型得到右值
特别的,我们能为返回类型是非常量引用的函数的结果赋值
列表初始化返回值
函数可以返回花括号包围的值的列表,函数不能返回数组,但可以返回数组的指针