精华内容
下载资源
问答
  • findContours函数参数详解

    万次阅读 多人点赞 2016-08-19 21:54:17
    注: 这篇文章用的OpenCV版本是2.4.10, 3以上的OpenCV版本相关函数可能有改动Opencv中通过使用findContours函数,简单几个的步骤就可以检测出物体的轮廓,很方便。这些准备继续探讨一下findContours方法中各参数的...

    注: 这篇文章用的OpenCV版本是2.4.10, 3以上的OpenCV版本相关函数可能有改动


    Opencv中通过使用findContours函数,简单几个的步骤就可以检测出物体的轮廓,很方便。这些准备继续探讨一下

    findContours方法中各参数的含义及用法,比如要求只检测最外层轮廓该怎么办?contours里边的数据结构是怎样

    的?hierarchy到底是什么鬼?Point()有什么用?


    先从findContours函数原型看起:


    findContours( InputOutputArray image, OutputArrayOfArrays contours,
                                  OutputArray hierarchy, int mode,
                                  int method, Point offset=Point());


    第一个参数:image,单通道图像矩阵,可以是灰度图,但更常用的是二值图像,一般是经过Canny、拉普拉斯等边

                         缘检测算子处理过的二值图像;


    第二个参数:contours,定义为vector<vector<Point>> contours”,是一个向量,并且是一个双重向量,向量

               内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。  

               有多少轮廓,向量contours就有多少元素。


    第三个参数:hierarchy,定义为“vector<Vec4i> hierarchy”,先来看一下Vec4i的定义:

                               typedef    Vec<int, 4>   Vec4i;                                                                                                                                       

               Vec4i是Vec<int,4>的别名,定义了一个“向量内每一个元素包含了4个int型变量”的向量。

               所以从定义上看,hierarchy也是一个向量,向量内每个元素保存了一个包含4个int整型的数组

               向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同

               hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第

            i个轮廓的一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个

            轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为

            默认值-1。


    第四个参数:int型的mode,定义轮廓的检索模式:


               取值一:CV_RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略


               取值二:CV_RETR_LIST   检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关

                      系,彼此之间独立,没有等级关系,这就意味着这个检索模式下不存在父轮廓或内嵌轮廓

                      所以hierarchy向量内所有元素的第3、第4个分量都会被置为-1,具体下文会讲到


               取值三:CV_RETR_CCOMP  检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围

                      内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层


               取值四:CV_RETR_TREE, 检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内

                       层轮廓还可以继续包含内嵌轮廓。


    第五个参数:int型的method,定义轮廓的近似方法:


               取值一:CV_CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内


               取值二:CV_CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours

                       向量内,拐点与拐点之间直线段上的信息点不予保留


               取值三和四:CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近

                       似算法


    第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加

                上该偏移量并且Point还可以是负值



    下边用效果图对比一下findContours函数中各参数取不同值时,向量contours和hierarchy的内容如何变化,有何

    异同。


    主体程序如下:

    #include "core/core.hpp"  
    #include "highgui/highgui.hpp"  
    #include "imgproc/imgproc.hpp"  
    #include "iostream"
    
    using namespace std; 
    using namespace cv;  
    
    int main(int argc,char *argv[])  
    {
    	Mat imageSource=imread(argv[1],0);
    	imshow("Source Image",imageSource);
    	Mat image;
    	GaussianBlur(imageSource,image,Size(3,3),0);
    	Canny(image,image,100,250);
    	vector<vector<Point>> contours;
    	vector<Vec4i> hierarchy;
    	findContours(image,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
    	Mat imageContours=Mat::zeros(image.size(),CV_8UC1);
    	Mat Contours=Mat::zeros(image.size(),CV_8UC1);  //绘制
    	for(int i=0;i<contours.size();i++)
    	{
    		//contours[i]代表的是第i个轮廓,contours[i].size()代表的是第i个轮廓上所有的像素点数
    		for(int j=0;j<contours[i].size();j++) 
    		{
    			//绘制出contours向量内所有的像素点
    			Point P=Point(contours[i][j].x,contours[i][j].y);
    			Contours.at<uchar>(P)=255;
    		}
    
    		//输出hierarchy向量内容
    		char ch[256];
    		sprintf(ch,"%d",i);
    		string str=ch;
    		cout<<"向量hierarchy的第" <<str<<" 个元素内容为:"<<endl<<hierarchy[i]<<endl<<endl;
    
    		//绘制轮廓
    		drawContours(imageContours,contours,i,Scalar(255),1,8,hierarchy);
    	}
    	imshow("Contours Image",imageContours); //轮廓
    	imshow("Point of Contours",Contours);   //向量contours内保存的所有轮廓点集
    	waitKey(0);
    	return 0;
    }
    

    程序中所用原始图像如下:




    通过调整第四个参数mode——轮廓的检索模式、第五个参数method——轮廓的近似方式和不同的偏移量Point(),就可以得到以下效果。



    一、mode取值“CV_RETR_EXTERNAL”,method取值“CV_CHAIN_APPROX_NONE”,即只检测最外层轮廓,并且保存轮廓上所有点:



    轮廓:



    只有最外层的轮廓被检测到,内层的轮廓被忽略


    contours向量内所有点集:



    保存了所有轮廓上的所有点,图像表现跟轮廓一致


    hierarchy向量:



    重温一下hierarchy向量————向量中每个元素的4个整形分别对应当前轮廓的后一个轮廓、前一个轮廓、父轮廓、内

    嵌轮廓的索引编号。


    本次参数配置下,hierarchy向量内有3个元素,分别对应于3个轮廓。以第2个轮廓(对应向量内第1个元素)为例,

    内容为[2,0,-1,-1], “2”表示当前轮廓的后一个轮廓的编号为2,“0”表示当前轮廓的前一个轮廓编号为0,其后2

    个“-1”表示为空,因为只有最外层轮廓这一个等级,所以不存在父轮廓和内嵌轮廓。




    二、 mode取值“CV_RETR_LIST”,method取值“CV_CHAIN_APPROX_SIMPLE”检测所有轮廓,但各轮廓之间彼此独立,不建立等级关系,并且仅保存轮廓上拐点信息:



    检测到的轮廓跟上文“一”中是一致的,不再显示。


    contours向量内所有点集:



    contours向量中所有的拐点信息得到了保留,但是拐点与拐点之间直线段的部分省略掉了


    hierarchy向量(截取一部分):




    本次参数配置下,检测出了较多轮廓。第1、第2个整形值分别指向上一个和下一个轮廓编号,由于本次配置mode取

    值“RETR_LIST”,各轮廓间各自独立,不建立等级关系,所以第3、第4个整形参数为空,设为值-1。



    三、mode取值“CV_RETR_TREE”,method取值“CV_CHAIN_APPROX_NONE”即检测所有轮廓,轮廓间建立外层、内层的等级关系,并且保存轮廓上所有点。



    contours向量内所有点集:



    所有内外层轮廓都被检测到,contours点集组成的图形跟轮廓表现一致。


    hierarchy向量(截取一部分)


    本次参数配置要求检测所有轮廓,每个轮廓都被划分等级,最外围、第一内围、第二内围等等,所以除第1个最后一

    个轮廓外,其他轮廓都具有不为-1的第3、第4个整形参数,分别指向当前轮廓的父轮廓、内嵌轮廓索引编号。


    四、Point()偏移量设置


    使用三中的参数配置,设置偏移量Point为Point(45,30)。


    此时轮廓图像为:



    可以看到轮廓图像整体向右下角有一个偏转,偏转量就是设置的(45,30)。

    这个偏移量的设置不能过大或过小(负方向上的过小),若图像上任一点加上该偏移量后超出图像边界,程序会内存

    溢出报错。

    findContours函数的各参数就探讨到此,其他参数配置的情况大同小异。值得关注一下的是绘制轮廓的函数

    drawContours中最后一个参数是一个Point类型的offset,这个offset跟findContours函数中的offset含义一致,设置之

    后所绘制的轮廓是原始轮廓上所有像素点加上该偏移量offset后的效果。


    当所分析图像是另外一个图像的ROI的时候,这个offset偏移量就可以大显身手了。通过加减这个偏移量,就可以把

    ROI图像的检测结果投影到原始图像对应位置上



    展开全文
  • 可以通过该指针变量调用函数函数指针有两个用途:调用函数做函数参数: 调用函数,如下所示:   输出结果如下: 由以上可以说明成功调用。    b.无参函数指针做参数的...

    转载于:http://blog.csdn.net/vlily/article/details/7244682

    转载于:http://blog.csdn.net/shengnan_wu/article/details/8116935

    转载于:http://blog.csdn.net/callmeback/article/details/4242260/

    转载于:https://blog.csdn.net/initiallysunny/article/details/53708466 

    C++中一个函数作为作为另一个函数的参数:
     把函数名作为参数就是函数的地址了.
    要将函数名作为参数,需要使用函数指针。

    函数指针的定义格式为

    ret_type (*var_name)(arg_list);

    表示返回值为ret_type,参数列表为arg_list的函数指针var_name.

    int (*p)(int,int);

    表示返回值为int,参数为两个int型的函数指针p。

    以函数指针作为形参,即可实现函数名作为参数,由另一个函数调用。
     

    一、 定义某一函数的指针类型:
    就像自定义数据类型一样,我们也可以先定义一个函数指针类型,然后再用这个类型来申明函数指针变量。
    我先给你一个自定义数据类型的例子。
    typedef int* PINT;    //为int* 类型定义了一个PINT的别名
    int main()
    {
      int x;
      PINT px=&x;   //与int * px=&x;是等价的。PINT类型其实就是int * 类型
      *px=10;       //px就是int*类型的变量  
      return 0;
    }
    根据注释,应该不难看懂吧!(虽然你可能很少这样定义使用,但以后学习Win32编程时会经常见到的。)
    下面我们来看一下函数指针类型的定义及使用:(请与上对照!)
    //自行包含头文件
    void MyFun(int x);    //此处的申明也可写成:void MyFun( int );
    typedef void (*FunType)(int );   //这样只是定义一个函数指针类型
    FunType FunP;              //然后用FunType类型来申明全局FunP变量

    int main(int argc, char* argv[])
    {
    //FunType FunP;    //函数指针变量当然也是可以是局部的 ,那就请在这里申明了。 
       MyFun(10);     
       FunP=&MyFun;  
       (*FunP)(20);    

          return 0;
    }

    void MyFun(int x)  
    {
       printf(“%d\n”,x);
    }

    看黑体部分:
    首先,在void (*FunType)(int ); 前加了一个typedef 。这样只是定义一个名为FunType函数指针类型,而不是一个FunType变量。
    然后,FunType FunP;  这句就如PINT px;一样地申明一个FunP变量。
    其它相同。整个程序完成了相同的事。
    这样做法的好处是:
    有了FunType类型后,我们就可以同样地、很方便地用FunType类型来申明多个同类型的函数指针变量了。如下:
    FunType FunP2;
    FunType FunP3;
    //……
     
    二、 函数指针作为某个函数的参数
    既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。所以,你还应知道函数指针是如何作为某个函数的参数来传递使用的。
    给你一个实例:
    要求:我要设计一个CallMyFun函数,这个函数可以通过参数中的函数指针值不同来分别调用MyFun1、MyFun2、MyFun3这三个函数(注:这三个函数的定义格式应相同)。
    实现:代码如下:
    //自行包含头文件 
    void MyFun1(int x);  
    void MyFun2(int x);  
    void MyFun3(int x);  
    typedef void (*FunType)(int ); //②. 定义一个函数指针类型FunType,与①函数类型一至
    void CallMyFun(FunType fp,int x);

    int main(int argc, char* argv[])
    {
       CallMyFun(MyFun1,10);   //⑤. 通过CallMyFun函数分别调用三个不同的函数
       CallMyFun(MyFun2,20);   
       CallMyFun(MyFun3,30);   
    }
    void CallMyFun(FunType fp,int x) //③. 参数fp的类型是FunType。
    {
      fp(x);//④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
    }
    void MyFun1(int x) // ①. 这是个有一个参数的函数,以下两个函数也相同
    {
       printf(“函数MyFun1中输出:%d\n”,x);
    }
    void MyFun2(int x)  
    {
       printf(“函数MyFun2中输出:%d\n”,x);
    }
    void MyFun3(int x)  
    {
       printf(“函数MyFun3中输出:%d\n”,x);
    }
    输出结果:略
     

     

     

    1. 函数指针是指向函数的指针变量。c在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针指向的地址处。有了指向函数的指针变量后。可以通过该指针变量调用函数,函数指针有两个用途:调用函数、做函数的参数:

      1. 调用函数,如下所示:

     

    输出结果如下:

    由以上可以说明成功调用。

     

       b.无参函数指针做参数的实现,如下(标准写法)所示:

     

    输出结果如下:

     

    还有以下写法也能成功,因为c语言标准规定可以这样用:

     

    也能成功输出

     

    c.带参有返回值的函数指针做参数的

     

     

    输出结果如下:

     

    而不能写成如下所示:

     

    也可写成以下形式,其中涉及到函数指针类型的转换:

     

    2.函数指针数组的实用之处:当我们需要判断大量条件的时候,并且在每一个条件都有相应的处理函数,这时实用switch...case..的代码量会很大,并且效率会比较低,这个时候就可以使用函数指针数组来解决这个问题了,可以使用每个条件为数组下表:如下所示:

    结果如下

     

     

    回调函数

     

    1、基础知识

    所谓回调,就是模块A要通过模块B的某个函数b()完成一定的功能,但是函数b()自己无法实现全部功能,需要反过头来调用模块A中的某个函数a()来完成,这个a()就是回调函数。如下图

    ①约定接口规范。在模块B必须约定接口规范,也就是定义回调函数a()的函数原型

     

    一开始是不好理解,用下面这个例子可能会有帮助:

    诸葛亮(A)给赵子龙(B)一个锦囊(a()),吩咐他在干活时(b())若遇到危急时打开按锦囊(a())指示办, 锦囊里的命令就是回调函数,危急时刻就是回调的时机。 

    不同的锦囊里可以有不同的命令。

     

    在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

    为了弄明白这种函数的奥妙,首先提出三个问题:

    1.        回调函数是什么东西?

    2.        回调函数怎么开发,怎么使用?

    3.        回调函数的作用,应该在什么情况下使用?

     

    带着问题来学习,有目的!呵呵,个人经验。

    打开baidu.com、google.cn搜索了好多资料,如下:

    顺便提一下,某君的一个签名很让我佩服:1好好活着,因为我们会死很久。2五千年的文明 两百年的无奈

     

    第一个问题:

    *******************************************************************************

    其实回调就是一种利用函数指针进行函数调用的过程.  

    为什么要用回调呢?比如我要写一个子模块给你用,   来接收远程socket发来的命令.当我接收到命令后,   需要调用你的主模块的函数,   来进行相应的处理.但是我不知道你要用哪个函数来处理这个命令,     我也不知道你的主模块是什么.cpp或者.h,   或者说,   我根本不用关心你在主模块里怎么处理它,   也不应该关心用什么函数处理它......   怎么办?

    使用回调!

    —— lone wolf

     

    使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。

    —— 某专家

     

    回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

    —— 绿叶

     

    http://hi.baidu.com/zhuyipeng/blog/item/863fefdb7c736c63d1164eec.html 是一篇比较好的文章。

     

    什么是回调函数?
      回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
      理解回调函数!

    —— jufengfeng

     

    Function Pointers provide the concept of callback functions.

    —— newty.de

    *******************************************************************************

    看了这么多的资料,我只将每位的定义总结一下就一句话:回调函数就是函数指针的一种用法。

    在部分资料上,大量讨论了回调函数怎么被调用,到底被谁调用,还有好多的图形,我认为都没有看到问题的本质。

     

     

    第二个问题:

    *********************************************************************

    我实现了一个很简单的回调函数。

    #include <stdio.h>

     

    void printWelcome(int len)

    {

           printf("欢迎欢迎 -- %d/n", len);

    }

     

    void printGoodbye(int len)

    {

           printf("送客送客 -- %d/n", len);

    }

     

    void callback(int times, void (* print)(int))

    {

           int i;

           for (i = 0; i < times; ++i)

           {

                  print(i);

           }

           printf("/n我不知道你是迎客还是送客!/n/n");

    }

    void main(void)

    {

           callback(10, printWelcome);

           callback(10, printGoodbye);

           printWelcome(5);

    }

    *******************************************************************************

    上面的代码没有被任何系统函数调用,说明那些东西只是撒撒土迷迷路人眼而已。还有面相对象编程时,用class给封装起来也是掩人耳目,不要被外表所迷惑。

     

     

    第三个问题:

    *********************************************************************

    用过STL的人都知道,在STL中众多算法和程序都用到回调函数,这实现了一种策略。只要任何符合我的标准的函数和计算都可以用我这个公式。你可以实现各种各样的回调函数,只要符合我的格式就能用。

    就上面的程序来说,你只要函数格式符合cllback第二个参数的格式不论你给别人做饭、铺床叠被都可以正常工作。这就是回调的作用,把回调实现留给别人。

    这是一个用法。

     

    有一位朋友用分层的概念来解释了回调机制:callback函数为B层,main函数和print*函数为A层,A层调用了B层的回调函数callmeback,而B层的回调函数调用了A层的实现函数print*。说白了B层就是一个接口。

     

     

    这是我的理解。Over!

    展开全文
  • python函数参数以及顺序

    千次阅读 2019-02-25 16:25:08
    必选参数(位置参数) 默认参数 可变参数 关键字参数 参数组合 在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都...函数参数 函数的参数-廖雪峰python3 ...

    必选参数(位置参数)
    默认参数
    可变参数
    关键字参数
    *运算符用于实参的时候,可以把一个可迭代对象拆开作为函数的参数(注意,当可迭代对象是字典的时候,会用字典的key,而不是value),用于函数形参时,可以接受不确定数量参数

    参数组合
    在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。
    函数参数
    函数的参数-廖雪峰python3

    展开全文
  • python函数除了不带参数,带固定参数之外,还有另外三类函数参数有重要使用价值,是提升python水平需要强化的内容。它们是默认参数、元组参数和字典参数。下面举例子说明。 1.默认参数 即在函数定义时赋值的参数。...

    python函数除了不带参数,带固定参数之外,还有另外三类函数参数有重要使用价值,是提升python水平需要强化的内容。它们是默认参数、元组参数和字典参数。下面举例子说明。

    1.默认参数

    即在函数定义时赋值的参数。

    #默认参数主要是为了减少重复输入的次数。
    def func_default(x,y=100,z="good"):
        print(x,y,z)
    
    func_default(78)
    func_default(78,99)
    func_default(78,99,"电影")
    func_default(x=120,z="电视剧")
    func_default(z="喜剧",x=500)#参数可以调换位置。
    

    输出是:

    2.以元组为参数

    以元组为参数时在参数名前加一个“*”号以示区别。

    #以元组作为参数
    def func_tuple(name,*args):
        print(name + " 有以下雅称:")
        for i in args:
            print(i)
    
    func_tuple("孙悟空","monkey","maomao","xueba")

    输出是:

    3.以字典作为参数

    参数名前加“**”以示区别。

    #以字典(键值对)作为参数
    def func_dict(**kwargs):
        print("参数的格式为:",type(kwargs))
        for i in kwargs:#输出值
            print(kwargs[i])
        for i in kwargs:#输出键
            print(i)
        for i in kwargs:#输出键值
            print(i,kwargs[i])
        for i in kwargs:#输出所有键值i次
            print(kwargs)
    func_dict(aa=1,bb=2,cc=3)#注意赋值方式

    输出是:

    4.一个综合的例子

    #综合例子
    # 带一个*的是元组,带两个星号的是字典。
    def total(a=5,*numbers,**phonebook):
        print('a',a)
        for single_item in numbers:
            print('single_item',single_item)
        for first_part,second_part in phonebook.items():
            print(first_part,second_part)
    total(10,1,2,3,Jack=1123,John=2231,Inge=1560)

    输出是:

    展开全文
  • 关键字参数:**others,便于函数功能的扩展 任意的参数列表 *others 解包参数列表 解包参数列表 函数函数式编程 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的...
  • C++(笔记)容器(vector)作为函数参数如何传参

    万次阅读 多人点赞 2017-05-17 17:51:54
    一、大致以下类型 void 函数名( vector< int> obj ); void 函数名( vector* pobj ); void 函数名( const vector* pobj ); // 在函数内不能改变 pobj 指向的对象 ,//调用时不会调用拷贝构造函数 void 函数名...
  • Python自定义函数及函数参数

    千次阅读 2015-12-08 23:46:56
    Python函数的定义实例如下: def funA(a,b): "函数描述性文字" s=a+b ...可以函数参数设置默认值,如果需要为函数参数设置默认值,则采用如下定义: def funB(a,b=0): "函数描述性文字
  • js匿名函数作为函数参数 (返回值作为另一个函数的参数)
  • C++函数参数的默认值

    千次阅读 2018-11-03 13:30:20
    在给函数参数赋默认值的时候要注意以下几点: (1)参数默认值必须从右向左依次赋值 (2)函数的默认值不可以重复赋值 下面的这种情况也是可以的,这种赋值情况也是从左到右 下面这种情况就是重复赋值的情况.....
  • c语言中函数参数处理顺序 下面我们来看2个案例,分析下c语言中函数参数处理顺序。 第一个: #include "stdio.h" void fn(int a,int b,int c) { printf("%d,%d,%d", a, b, c); } void main() { int a = 3; ....
  • http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738449338c8a122a7f2e047899fc162f4a7205ea3000########################################################函数参数:...
  • 函数指针是指向函数的指针变量。c在编译时,每一个函数都有一个入口地址,该...可以通过该指针变量调用函数函数指针有两个用途:调用函数做函数参数: 调用函数,如下所示: 输出结果如下: ...
  • 函数参数的压栈过程

    千次阅读 2014-02-26 20:59:58
    1 _cdecl 按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于“C”函数或者变量,修饰名是在函数名前加下划线。对于“C++”函数,有所...由于是调用者负责把参数弹出栈,所以可以函数定义个数不定的参数,如
  • 函数参数函数调用

    千次阅读 2015-03-14 16:07:06
    在定义函数函数名后面括号中的变量称为“形参”,在主调函数(一般为Main)调用一个函数时,函数名后面括号中的参数可以是一个表达式)称为“实参”。 例如: void func(int x,int y) { ........
  • 函数参数执行顺序

    千次阅读 2016-09-14 20:37:26
    C++ 函数参数执行顺序小记 事情是由于下面这段代码开始的, 很小也很容易忽略的一个点, 函数参数的读取顺序到底是从左到右边还是从右边到左边, 有说这和编译器有关的, 但是下面的实验也好, 理论上分析也好, 基本...
  • 函数指针作为某个函数参数

    千次阅读 2017-01-07 17:31:00
    转载;... 分类: C/C++ ... 函数指针变量是一个变量,可以作为某个函数的... 一个实例: 设计一个 CallMyFun 函数,这个函数可以通过参数中的函数指针值不同来分别调用 MyFun1、MyFun2、MyFun3 这三个函数(注:这
  •  main函数可以不带参数,也可以参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数参数只能有两个,习惯上这两个参数写为argc和argv。所以C99标准中规定只有以下两种定义方式是正确
  • 函数参数压栈顺序

    千次阅读 2013-10-09 22:13:13
    函数调用约定不仅决定了发生函数调用时函数参数的入栈顺序,还决定了是由调用者函数还是被调用函数负责清除栈中的参数,还原堆栈。函数调用约定有很多方 式,除了常见的__cdecl,__fastcall和__stdcall之外,C++的...
  • C++函数参数赋值

    千次阅读 2013-11-09 11:28:38
    C++语法中有这样一种规定:当调用函数时,没有指定参数值,参数就会被赋默认值。但是,此函数必须是在第一次声明或第一次定义的时候,给参数指定了默认值。 在使用时应该注意以下几点: 第一点:参数默认值只允许...
  • python中函数参数

    千次阅读 2018-10-25 19:40:29
    1、为什么使用函数? 因为没有函数的编程只是在单纯的写代码逻辑,如果想重用代码逻辑,只能够copy一份代码。但是一旦使用函数,就可以将一些相同的代码逻辑封装起来,这样可以提高代码的重复使用率,提升开发效率...
  • golang函数实现默认参数

    千次阅读 2019-10-16 23:21:37
    golang本身并不支持像C++那样的函数默认参数,不过可以自己实现相关方法达到默认参数的目的; 以下用创建人的个人信息为例,名字必须输入,而邮箱地址和年龄可以不用输入,不输入时使用默认值,示例代码如下: ...
  • lua 函数参数传递

    千次阅读 2018-02-11 15:08:07
    如果想达到函数内部修改的效果,可以通过传递"指针"来完成。这里的指针指的是表这样的数据结构:在传递表时,仅传递了一个记录该数据地址的变量,之后在函数体内对该变量内部元素进行操作时,可以影响原来...
  • Scala 函数 - 默认参数函数

    千次阅读 2018-09-15 00:38:20
    Scala允许您指定函数参数的默认值。 这样一个参数可以从函数调用中选择性地省略,在这种情况下,相应的参数值将使用默认值。如果指定其中一个参数,则使用该参数将传递第一个参数,第二个参数将从默认值中获取。 ...
  • 函数模板参数

    千次阅读 2019-03-24 00:22:11
    1)从模板函数实参表获得的信息有矛盾之处。 template<typename T> void fun(T const& a,T const& b);但是你调用时却是fun(250,250.4);那你就必须写成fun<int>(250,250.4); 2)需要获得特定...
  • 本文用简单的例子说明了C语言中数组做函数参数,数组名a与&a区别,数组名a的"数据类型",以及编译器的不同,相应指针所占字节的不同导致程序的细微差别。
  • (struct)结构体变量作为函数参数调用的方法小结

    万次阅读 多人点赞 2015-04-29 19:37:38
    结构体变量作为函数参数传递的3种方法 将一个结构体变量中的数据传递给另一个函数,有下列3种方法: 用结构体变量名作参数。一般较少用这种方法。 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。 用...
  • const 更大的魅力是它可以修饰函数参数、返回值,甚至函数的定义体。 const 是constant 的缩写,“恒定不变”的意思。被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。所以很多C++...
  • python学习——函数参数

    千次阅读 2016-07-09 17:03:00
    对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。 Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外...
  • C语言二维数组作为函数参数传递

    千次阅读 2015-05-06 15:06:11
    二维数组作为函数参数,实参可以直接使用二维数组名,在被调用函数中队形参数组定义可以指定所有维数的大小,也可以省略第一维的大小说明,如: void f(int a[3][4]); void f(int a[][4]); 它们是合法且等价,也可

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,236,613
精华内容 494,645
关键字:

以下什么可以做函数的参数