当前位置: 首页 > news >正文

登尼特网站建设服务wordpress淘宝客神器插件

登尼特网站建设服务,wordpress淘宝客神器插件,建立平台网站要多久,网站可以做的兼职介绍 首先介绍函数的定义和声明#xff0c;包括如何传入参数以及函数如何返回结果。C语言允许使用重载函数#xff0c;即几个不同的函数可以使用向同一个名字。所以接下来介绍重载函数的方法#xff0c;以及编译器选择如何从函数的若干重载的形式中选取一个与调用模板相互匹…介绍 首先介绍函数的定义和声明包括如何传入参数以及函数如何返回结果。C语言允许使用重载函数即几个不同的函数可以使用向同一个名字。所以接下来介绍重载函数的方法以及编译器选择如何从函数的若干重载的形式中选取一个与调用模板相互匹配的版本进行使用。最后介绍一些关于函数指针的知识。 6.1 函数的基础 一个函数的定义包括以下几个部分返回类型、函数的名字、0或者多个形参组成的列表或者函数体。形参以逗号分隔形参列表位于一对圆括号里面。函数具体实现的代码写在一对花括号里面整体称之为函数体。 编写函数 写一个求阶乘的函数 #includeiostream using namespace std;int fact(int val){int rel 1;for(int i val;i ! 0;i--){rel * i;}return rel; }int main(){cout The result of rel is fact(5) endl;return 0; } 调用函数 调用函数主要完成两项工作1实参初始化函数对应的形参2将控制权交给调用函数这个时候被调的函数开始执行。 形参和实参 实参数量和形参数量、类型一致如果定义没有参数的函数使用void关键字void f1();// 隐式定义空的形参列表    void f2(void); //显式定义空的形参列表任意两个形参不可以同名而且函数最外层作用域中的变量也不可以和形参同名。 函数的返回类型 一种特殊的返回类型是void函数的返回类型不可以是数组或函数类型但可以是指向函数或者数组的指针。 6.1.1 局部对象 形参和函数体内部定义的变量统一称为局部变量对于函数而言是局部的、是隐藏的。函数执行的时候创建函数执行结束的时候会销毁的变量叫做自动对象。对于局部变量对应的自动对象来说如果变量本身含有初始化的数值就采用初始化的数值否则就采用默认的初始化的值。 局部静态对象 将局部变量定义成static的类型这种使用static类型修饰的变量只会在程序第一次进入的时候进行初始化直到程序的终止才会销毁在此期间即使对象所在的函数结束也不会对它有任何的影响。 6.1.2 函数声明 函数声明不需要函数体也就是无需形参的名字。函数的三个要素返回类型、函数名字、形参类型描述了函数的接口说明了调用这个函数的一般将函数的声明放在头文件中就可以确保同一函数的声明保持一致一旦想要改变函数的接口只需要改变一条声明语句即可。定义函数的源文件应该包含所有函数声明的头文件这样编译器就会负责验证函数的定义和声明是否匹配 6.1.3 分离式编译 将程序拆分成不同的部分分别存储分离式编译器允许将程序分割到几个文件中对于每个文件进行独立编译。 编译和链接多个源文件 头文件 存放函数的声明源码文件 存放函数的具体实现的代码主函数 调用函数的具体执行需要引入头文件 例子 源文件 factCC.cpp int fact(int val){int rel 1;for(int i val;i ! 0;i--){rel * i;}return rel; } 头文件 factHead.h int fact(int val); main函数 #includeiostream #include factHead.h using namespace std;int main(){cout The result is fact(5) endl;return 0; } 6.2 参数传递 每次调用函数的时候都会重新创建它的形参并用传入的实参进行初始化和其他变量一样形参的类型决定了形参和实参的交互方式。如果形参是引用类型它将绑定到对应的实参上否则将实参的数值拷贝后赋值给形参。当形参是引用类型时它对应的实参被引用传递或者函数被传引用调用。和其他引用一样引用形参也是它绑定的对象的别名即引用形参是他对应的实参的别名。当实参的数值被拷贝给形参的时候形参和实参是两个相互独立的对象。这样的实参被值传递或者函数被传值调用。 6.2.1 传值参数 当初始化一个非引用类型的变量时初始值被拷贝给变量此时对于变量的改动不会影响初始值。 int n 0;//int类型的初始变量 int i n;//i是n的副本 i 42;// 对于i的改变不会影响到n的数值 指针形参 指针的行为和其他非引用的类型一致。执行指针拷贝操作的时候拷贝的是指针的数值。拷贝之后两个指针是不同的指针。因为指针使我们可以间接地访问它所指的对象所以通过指针可以修改它所指的对象的数值。 int main(){int n0,i42;int *p n,*q i;//p指向n,q指向i*p 44;//n的数值改变p不变pq;//p现在指向i了但是i和n的数值都不变cout The n result is n endl; //44cout The i result is i endl; //42cout The p result is *p endl;//42cout The q result is *q endl;//42return 0; } //该函数接受一个指针然后将只针所指向的位置设为0 void reset(int *ip){*ip 0;// 改变了指针ip所指向的数值ip 0;//只改变了ip的局部拷贝实参未被改变 } int main(){int i 42;reset(i);cout i i endl;return 0; } C建议使用引用类型的形参替代指针 6.2.2 传引用参数 对于引用的操作实际上是作用在引用所引的对象上。 int main(){int n 0,i42;int r n; //r绑定了nr是n的另外一个名字r 42; //改变了n的数值n也是42cout n n endl;//42cout r r endl;//42return 0; } //该函数接受一个int对象的引用然后将对象的数值设为0 void reset(int i){//i是传给函数对象的另外一个名字i 0;//改变了i所引对象的数值 }int main(){int j 42;reset(j);cout j j endl;//42return 0; } 和其他引用的类型一致引用形参绑定初始化他的对象。当调用reset函数的时i就会绑定我们传给函数的int对象改变i的数值也就是改变i引用的数值。 使用引用避免拷贝 拷贝大的类类型对象或者容器对象比较低效甚至有的类类型就根本不支持拷贝操作。当某种类型不支持拷贝操作时函数只能通过引用形参来访问该类型的对象。比如一个比较两个字符串大小的函数考虑到字符串都比较长就要避免直接拷贝他们这个时候使用引用形参就是比较明智的选择因为比较长度无法改变string对象的内容所以把形参定义成对于常量的引用。 bool isShorter(const string s1,const string s2){return s1.size() s2.size(); } 使用形参返回额外的信息 使用形参可以一次返回多个结果提供了有效的途径。例子函数返回在string中某个字符第一次出现的位置以及该字符总共出现的次数如何使函数既可以返回位置也返回出现的次数呢一种方法是定义一个新的数据类型让他包含位置和次数两个成员另外一种方法是给函数传入一个额外的引用实参另其保存字符出现的次数 //返回s中c第一次出现的位置索引 //引用形参occurs负责统计c出现的总的次数 string::size_type find_char(const string s,char c,string::size_type occurs){auto ret s.size();//第一次出现的位置如果存在的话occurs 0;for(decltype(ret) i 0;i! s.size();i){if(s[i] c){if(ret s.size()){ret i;} occurs;}}return ret; }bool isShorter(const string s1,const string s2){return s1.size() s2.size(); } int main(){string s1 HelloWorld;string s2 Hello;string::size_type ctr;auto index find_char(s1,o,ctr);cout index index ctr ctr endl;bool s3 isShorter(s2,s1);cout s3 endl;return 0; } 其中给ret赋值为最大长度的目的是为了在后面判断的时候查看是否改变从而确定是不是第一次遇到这个数值可以将大于数组长度的任意值作为判定的条件。 6.2.3 const形参和实参 当形参是const的时候顶层的const作用于对象的本身。const int ci 42; // 不能改变ci,const是顶层的int i ci; // 正确当拷贝ci的时候会忽略他的顶层的数值int * const p i;//const是顶层的不可以给p赋值*p 0;//正确通过p改变对象的的内容是允许的现在i的数值变为了0和其他初始值一样当使用实参初始化形参的时候会忽略掉顶层的const。即形参的顶层const被忽略掉了。当形参有顶层的const的时候传给他的常量对象或者非常量对象都是可以的。void fun(const int i)//fun可以能够读取i但是不可以向i中写值void fun(const int i)//错误重复定义了funint C允许定义若干具有相同的名字的函数前提是不同函数的形参列表应该有明确的区别。此处是因为const被忽略掉了因IC两个函数没有任何的区别不可以重复的定义。 指针或者引用形参与const 形参的初始化和变量的初始化的方式是一样的。我们可以使用非常量初始化一个底层的const对象但是反过来不可以同时一个普通的引用必须使用相同类型的对象初始化。int i 42;const int *cp i; //正确cp不能改变i,const是顶层的const int r i; //正确r不能改变i,const是顶层的const int *r2 i; //正确r2不能改变i,const是顶层的int *p cp;//错误类型不符int r3 r;//错误类型不符int r4 42;//错误不能用字面值初始化一个非常量的引用将同样的规则使用在参数传递上 尽量使用常量引用 把函数不会改变的形参定义成普通的引用是一种常见的错误这么做会给调用者一种误导即函数不会改变它的实参的数值。使用引用而非常量引用也会极大地限制函数所能接受的实参类型。不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。这种错误很难排解这个是上面提到的代码对其进行修改string::size_type find_char(const string s,char c,string::size_type occurs)改为string::size_type find_char(const string s,char c,string::size_type occurs)将string类型的形参定义成常量引用。假如将其定义成普通的string没有const进行修饰。那么在使用的时候只可以auto index find_char(“Hello ”,o,ctr);编译会发生错误。假如其他函数将他们的形参定义成常量的引用那么第二个版本的函数无法在此类函数上正常使用。假设在一个判断string对象是否是句子的函数中使用find_char bool is_sentsence(const string s){//如果s的末尾有一个句号且仅有一个则是句子string::size_type ctr 0;return find_char(s,.,ctr) s.size()-1 ctr 1; } 如果find_char()第一个形参类型是string 那么会发生编译错误是因为s是常量的引用但是函数find_char被定义成可以只能接受普通引用。如果修改is_sentsence函数的形参类型只会转移错误使得is_sentsence函数只可以接受非常量的string对象。正确的思路是改变find_char的函数的形参。实在不行才修改is_sentsence函数在其内部定义一个string类型的变量另其为s的副本然后把这个string对象传递给find_char()。 6.2.4 数组形参 数组的两个特殊的性质使得我们定义和使用作用在数组上的函数有影响这两个性质是1不允许拷贝数组2使用数组的时候通常要将其转换为指针所以当为函数传递一个数组的时候实际上传递的是指向数组首元素的指针。虽然不能以数值的方式传递数组但是可以形参写成类似数组的形式。//尽管形式不同但是这三个print的函数是等价的//每个函数都会有一个const int*类型的形参void print(const int *);void print(const int[]); //函数的意图是作用于一个数组void print(const int[10]); //这里的维度表示我们期望数组会含有多少个元素实际上不一定//尽管表现形式不同但是上面这三个函数是等价的每个函数的唯一形参都是const int *类型的//当编译器处理对print函数的调用的时候只会检查传入的参数是否是const int *类型的int i 0,j[2] {0,1};print(i); //正确i的类型是int *print(j); //正确j转化成int *并且指向j[0]return 0;如果传递给print函数是一个数组则实参自动转化成指向数组首元素的指针数组的大小对于函数的调用没有关系但是在使用数组的时候需要注意到数组越界的问题。 使用标记指定数组的长度 要求数组本身拥有一个结束的标记典型问题是C风格的字符串中在字符后面跟着一个空的字符。 void print(const char *cp){if(cp) //如果cp不是一个空的指针while(*cp) //只要指针指向的字符不是空的字符串cout *cp ; //输出当前字符的数值并将指针向前移动一个位置 } int main(){char s[] Hello World!;print(s);return 0; } 这种方法适用于那些有着明显的结束标记但是该标记不会与普通的数据相互混淆的情形但是不适用于所有的取值都是合法的情形。 使用标准库规范 管理数组实参的第二种方法是传递指向数组首元素和尾后元素的指针 void print(const char *beg,const char *end){//输出beg到end之间不包含end的所有元素while (beg ! end){cout *beg;} }int main(){char s[] Hello;print(begin(s),end(s));return 0; } while循环使用解引用运算符和后置递减运算符输出当前元素并且在数组内将beg向前移动一个元素当beg和end指针相等的时候结束循环为了调用这个函数需要传入两个指针一个指向要输出的首元素一个指向尾元素的下一个位置。具体的调用方法如上图所示。此处使用bigin和end函数提供所需的地址。 显式传递一个表示数组大小的形参 第三种管理数组实参的方法是专门定义一个表示数组大小的形参在C程序和过去的C程序中常常使用这种方法。 //const int ia[] 等效于const int* ia //size表示数组的大小将它显式地传递给函数用于控制对ia元素的访问 void print(const int ia[],size_t size){for(size_t i 0;i ! size;i){cout ia[i] endl;} } int main(){int j[] {0,1,2,3,4,5,6,7,8,9};print(j,end(j) - begin(j));return 0; } 数组形参和const 前三个函数都将数组的形参定义成指向const的指针对于引用类型也同样适用于指针。当函数不需要对于数组元素执行写操作的时候数组的形参应该是指向const的指针。只有当函数确实要改变元素数值的时候才会把形参定义成指向常量的指针。 数组引用形参 C允许将变量定义成数组的引用基于同样的道理形参也是数组的引用。这个时候引用形参绑定到对应的实参上也就是绑定到数组上。 //正确形参是数组的引用维度是类型的一部分 void print(int (arr)[10]){for(auto elem : arr){cout elem endl;} } 因为数组的大小是构成数组类型的一部分所以只要不超过维度在函数体内就可以放心的使用数组。但是如果采用上面的代码格式就会限制了print函数的可用性即只能将函数作用于大小是10的数值。 注意事项  arr的两端的括号必不可少f(int arr[10]) //错误将arr声明成了引用类型f(int (arr)[10]) //正确arr是具有10个整数的整型数组的引用 传递多维数组 C实际上并没有多维数组所谓的所谓数组其实是数组的数组。和所有数组一样当将多维数组传递给函数的时候真正传递的是指向数组首个元素的指针。因为多维数组就是数组的数组因此首元素就是一个数组指针是一个指向数组的指针。数组的第二维度以及后面所有的维度的大小都是数组类型的一部分不可以忽略。//matrix指向数组的首个元素该数组的元素是由10个整数构成的数组void print(int (*matrix)[10],int rowSize){} 上面的语句是将matrix声明成指向10个整数的数组的指针。 //再一次强调*matrix两端的括号必不可少int *matrix[10]; //10个指针构成的数组int (*matrix)[10]; //指向含有10个整数的数组的指针 也可以使用数组的语法定义函数此时编译器会一如既往地忽略掉第一个维度所以最好不要把它包括在形参的列表内所以最好不要把它包括在形参列表内。//等价定义 void print(int matrix[][10] , int rowSize){}matrix的声明看起来是一个二维数组实际上形参是指向含有10个整数的数组的指针。 6.2.5 main 处理命令行选项 main函数是演示C程序如何向函数传递数组的好例子。到目前为止使用的是main函数都是只有空的形参列表的形式。比如int main(){}有时候确实需要给main函数传递实参一种常见的情况下是用户通过设置一组选项来确定函数所要执行的操作。例如假定main函数位于执行prog之内我们可以向程序传递下面的选项。prog -d -o ofile data0   这些命令的选项通过两个可以选择的形参传递给main函数int main (int argc, char *argv[]){   }第二个形参argv是一个数组他的元素是指向C风格的字符串的指针第一个形参argc表示数组中字符串的数量。因为第二个形参是数组所以main函数也可以定义成int main(int argc,char **argv[]){    },其中argv指向char *当形参传给main函数之后argv的第一个元素指向程序的名字或者一个空的字符串接下来的元素依次传递命令行提供的实参。最后一个指针之后的元素数值保证为0。当使用arrgv中的实参时一定要记得可选的实参从arrgv【1】开始arrgv[0]保存程序的名字并非用户的输入 6.2.6 含有可变形参的函数 一般使用在无法提前预知向函数传递几个实参的情形。为了处理不同数量实参的函数C11提供了两个主要的方法1如果所有的类型都相同可以传递一个名为initializer_list的标准库类型2如果实参的类型不同可以编写一个特殊的函数也就是所谓的可变参数模板。C还有一种特殊的形参类型即省略符号可以用它传递可变数量的实参。介绍的省略符形参一般只适用于与C函数交互的接口程序。 initializer_list形参 适用于函数的实参数量未知但是全部的实参类型是一致的情形。initializer_list是一种标准库类型用于表示某种特定类型的数值和数组其定义在同名的头文件中。initializer_listTlst; //默认初始化T类型元素的空的列表initializer_listTlst{a,b,c...}; //list元素的数量和初始值一样多lst的元素是对应初始值的副本列表中的元素是constlst2(lst); //拷贝或者赋值一个initializer_list对象不会拷贝列表中的元素拷贝之后原始列表和副本共享元素lst.size();//类表中元素的数量lst.begin();//返回指向lst中首元素的指针lst.end();//返回指向lst中尾元素下一个未知的指针initializer_list和vector一样也是一种模板类型定义initializer_list的时候也必须说明列表中所包含元素的类型initializer_liststring ls;  //initializer_list的元素类型是stringinitializer_listint li;    //initializer_list的元素类型是intinitializer_list中的元素永远是常量这一点不同于vector因此无法改变initializer_list对象中元素的数值。使用如下代码就可以编写输出错误信息的函数使其作用于可以改变的数量的实参。 void error_msg(initializer_liststring il){for(auto beg il.begin();beg ! il.end();beg){cout *beg endl;} } 如果想向initializer_list形参中传递一个数值的序列则必须将序列放在一对花括号内。 省略符形参 省略符形参是为了C程序访问特定的C代码而设置的这些代码使用了名为varargs的C的标准库的功能。通常省略形参不应该用于其他的目的。省略形参应该用于C和C通用的类型但是值得注意的是大多数的类类型的对象在传递给省略符形参的时候都无法正确的拷贝。省略形参只能出现在形参列表的最后一个位置形式无外乎两种void foo(parm_list,...);指定了foo函数的部分形参的类型对应于这些形参的实参将会执行正常的类型检查形参后面的逗号是可以选择的。void foo(...);  省略符形参所对应的实参不需要类型的检查 6.3 返回类型和return语句 return语句终止当前正在执行的函数并将控制权返回到该函数被调用的地方。两种形式return 和 return expression 6.3.1 无返回值函数 没有返回值的return语句只能用于返回类型是void的函数中。返回void的函数不需要非得有return语句因为在该类函数的最后一句会隐式执行return。通常情况下void函数如果想在他的中间位置退出可以使用return语句这个用法类似break。例如写一个swap函数使其在参与交换的数值相等的时候什么也不做直接退出 void swap(int v1,int v2){if(v1 v2){return ;}int tmp v2;v2 v1;v1 tmp; } int main(){int s1 1;int s2 1;swap(s1,s2);return 0; } 一个返回类型是void的函数也可以使用return的第二种形式不过此时return语句的expression必须是另外一个void的函数。强行令void函数返回其他类型的表达式将产生编译错误。 6.3.2 有返回值的函数 只要函数的返回类型不是void那么函数内部的每一个return语句必须返回一个数值。return的返回类型必须和函数的返回类型相互一致或者隐式转换成函数的返回类型在含有return语句的循环后面的应该也有一条return语句如果没有的话该程序是错误的很多编译器都无法发现这个错误 值是如何返回的 数值的返回和初始化一个变量或者形参的方式是完全一样的返回的数值用于初始化调用点的一个临时变量该临时变量就是函数调用的结果。必须注意函数返回局部变量时的初始化规则。例子给定计数值、单词和结束符之后判断计数值是否大于1是的话返回单词的复数否的话返回单词的原型 //如果str的数值大于1返回word的复数的形式 string make_plural(size_t ctr, const string word, char ending){return (ctr 1) ? word ending : word; } int main(){string s1 Hello Hello string world;cout make_plural(2,s1,s) ;return 0; } 这个函数返回的类型是string意味着返回值将会被拷贝到调用点。因此该函数将会返回一个word的副本或者一个未命名的临时的string对象该对象是word和string的和。同其他引用的类型一样如果函数返回引用则该引用仅仅是它所引用对象的一个别名。例子函数返回两个string中形参较短的那个并且返回其引用其中形参和返回类型都是const string的引用不管是调用函数还是返回的结果都不会真正的拷贝string对象。 //跳出两个string对象中较短的那个并且返回其引用 const string shorterString(const string s1,const string s2){return s1.size() s2.size() ? s1 : s2; } int main(){string s1 Hello Hello string world;string s2 Hello Hello;cout shorterString(s1,s2) ;return 0; } 不要返回局部对象的引用或者指针 函数执行完毕之后会释放掉占用的存储空间因此函数的终止意味着将局部变量的引用指向不再有效的内存区域。错误的原因在于试图访问未定义的变量返回局部对象的指针也是错误的函数完成局部对象释放指针将会指向一个不再可用的内存空间 //严重错误这个函数试图返回局部对象的引用 cosnt string manip(){string ret;//通过某种凡是改变一下retif(!ret.empty()){return ret;//错误返回的是一个对于局部变量的引用}else{return Empty!;//错误Empty是一个局部临时的变量} } 返回类类型函数和调用运算符 调用运算符存在优先级和结合律其优先级和点运算符号和箭头运算符号等同并且也符合左结合律。如果函数返回的指针、引用或者类对象就可以通过函数调用的结果来访问结果对象的成员。例如通过如下的形式得到较短的string对象的长度(这个例子相当于调用对象的子函数) //跳出两个string对象中较短的那个并且返回其引用 const string shorterString(const string s1,const string s2){return s1.size() s2.size() ? s1 : s2; }int main(){string s1 Hello Hello string world;string s2 Hello Hello; // cout shorterString(s1,s2) ;auto sz shorterString(s1,s2).size();cout sz endl;return 0; } 引用返回左值 函数的返回类型决定了函数的调用是否是左值。返回引用的函数得到左值其他类型的函数返回右值。可以像使用其他左值的使用方式一样来返回引用的函数的调用特别的是可以为返回类型是非常量的引用的函数的结果进行赋值。 char get_val(string str,string::size_type ix){return str[ix]; } int main(){string a(a Value); //输出a valuecout a endl;get_val(a,0) A;//将s[0]的数值改为Acout a endl; //将输出A valuereturn 0; } 返回读的值是引用因此调用是一个左值和其他的左值一样他也能出现在赋值运算符号的左侧如果返回的类型是对于常量的引用不能给调用的结果赋值 列表初始化返回值 函数可以返回花括号内包围的熟知的列表。类似于其他返回的结果此处的列表也用来对于对于表示函数返回的临时量进行初始化。如果列表为空临时量执行数值初始化否则返回的数值由函数的返回的类型决定。 主函数main的返回数值 函数的返回类型不是void必须返回一个数值但是mian函数例外允许main函数没有return语句直接结束。如果控制到达了main函数的结尾而且没有return语句编译器会隐式插入一个返回为0的return语句。mian函数的返回数值可以看做是状态的指示器。返回0表示执行成功其他数值表示返回失败其中非0的数值由具体机器而定。为了使得返回的类型和机器无关可以引入两个预处理的变量分别用来表示成功和失败。if(1){return EXIT_SUCCESS;}else{return EXIT_FAILURE;} 其中EXIT_SUCCESS和EXIT_FAILURE定义在头文件cstdlib头文件中因为上面两个变量属于预处理变量因此既不需要在前面加上std也不能在using声明中出现。 递归 如果一个函数调用了它自身无论是直接还是间接调用都称该函数是递归函数。例子使用递归函数实现求阶乘的功能 int factorial(int val){if(val 1 ){return factorial(val - 1) * val;return 1;} } int main(){cout factorial(5) endl;return 0; } 注意事项在使用递归函数的时候一定会包含一支路径是不包含递归调用的否则函数将会永远的执行下去。 6.3.3 返回数组的指针 因为数组不能被拷贝因此函数不会返回数组。但是函数可以返回数组的指针或者引用其中最为有效的方法是使用类型别名的方式。typedef int arrT[10];//arrT是一个类型的别名它表示的类型是含有10个整数的数组using arrT int[10];//arrT的等价声明arrT* func(int i);//func返回一个指向含有10个整数的数组的指针 声明一个返回数组指针的函数 要想在声明func时不使用类型别名必须牢记被定义的名字后面的数组的维度int arr[10]; //arr是一个含有10个整数的数组int *p1[10]; //p1是一个含有10个指针的数组int (*p2)[10] arr; //p2是一个指针指向含有10个整数的数组 Type *functionparameter_list[dimension]其中Type表示元素的类型dimension表示数组的大小*functionparameter_list两边的括号必须存在就像上面对于p2的定义一样如果没有这对括号函数的返回类型是指针的数组。 例子 int (*func(int i))[10];func(int i)表示调用func函数的时候需要一个int类型的实参(*func(int i))[10] 表示解引用func的调用将得到一个大小是10的数组int (*func(int i))[10]表示数组中的元素类型是int类型 使用尾置返回类型 可以使用尾置返回类型来替代上面提到的func声明的方法。任何函数都可以使用尾置返回即使是返回类型比较复杂的函数也仍然可以使用比如返回类型是数组的指针或者数组的引用。尾置返回类型跟在形参列表的后面并且以一个-符号开头。为了表示函数真正的返回类型跟在形参列表之后在本应该出现返回类型的地方放置一个auto。//func接受一个int类型的实参返回一个指针这个指针指向含有10个整数的数组 auto func(int i) - int(*)[10]; 把函数的返回值类型放在了形参列表的后面所以func函数返回的是一个指针并且这个指针指向了含有10个整数的数组 使用decltype(这一部分有问题) decltype关键字一般用于知道函数返回的指针指向哪个数组的时候进行对于返回类型的声明。例子函数返回一个指针该指针可以根据参数i的不同指向两个已知数组中的一个 int odd[] {1,3,5,7,9};int even[] {0,2,4,6,8};//返回一个指针这个指针指向含有5个整数的数组decltype (odd) *arrPtr (int i){return (i % 2) ? odd :even;} 程序无法执行decltype并不负责把数组类型转化成对应的指针所以decltype的结果是一个数组要想表示attPtr返回指针还必须在函数生命的时候加上一个*号。
http://www.pierceye.com/news/325849/

相关文章:

  • 中石建基础设施建设有限公司网站南阳网站建设的公司
  • 广东建设银行网站营销渠道策略
  • 廊坊开发区规划建设局网站网站域名续费一年多少钱
  • 网站建设需要哪些准备国外网站顶部菜单设计
  • 免费域名注册和免费建站深圳品牌沙发
  • php网站开发就业网站开发研究综述
  • 华升建设集团有限公司网站网站如何做那种诱导广告
  • 做资讯网站要什么手续科技设计公司网站模板下载
  • 西安互联网网站建设湘潭网站建设设计
  • 微网站开发方案模板前程无忧招聘网下载app官网
  • 网站推广方式大全如何写软文赚钱
  • 同城同镇网站建设做幼儿网站的目标
  • 上饶网站建设兼职辽宁沈阳做网站
  • 阳江企业网站好的外包公司
  • 深圳做分销商城网站我有域名跟空间能教我做网站吗
  • 网站子目录做推送用什么网站
  • 网站手机优化网站上传空间的ip地址
  • 做网站增加流量自助微信网站设计
  • 网站推广的6个方法是什么软件开发合同模板范本1
  • 营销网站手机站wordpress的主题目录
  • 达州建设企业网站重视网站商务通
  • 淘宝网站怎么做视频58做二手车网站应该怎么推广
  • 自动翻译网站软件cf刷枪网站怎么做的
  • 示范校建设验收网站网站对话窗口怎么做
  • phpcms 移动网站模板怎么做个人网页
  • 南宁手机建站公司新加坡网站后缀
  • 如何在建设部网站查询获奖情况如何申请电商网站
  • jsp网站访问万维网网站幻灯
  • 南通住房和城乡建设部网站首页安徽公司网站建设
  • 建筑论坛网站修改WordPress文章发布页面