精华内容
下载资源
问答
  • 函数指针指针函数用法和区别

    万次阅读 多人点赞 2018-05-24 08:11:10
    函数指针指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,...

    前言

    函数指针和指针函数,在学习 C 语言的时候遇到这两个东西简直头疼,当然还有更头疼的,比如什么函数指针函数、指针函数指针、数组指针、指针数组、函数指针数组等等,描述越长其定义就越复杂,当然理解起来就越难,特别是刚开始学习这门语言的童鞋,估计碰到这些东西就已经要崩溃了,然后好不容易死记硬背下来应付考试或者面试,然后过了几天发现,又是根本不会用,也不知道该在哪些地方用,这就尴尬了。
    今天这里只讲两个相对简单的,其实上面说那些太复杂的东西也真的很少用,即便是用了理解起来很麻烦,所以莫不如先深刻理解这两个比较容易的,并且项目中比较常用到。

    正文

    先来看看两者的定义以及说明。

    指针函数

    定义

    指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
    声明格式为:*类型标识符 函数名(参数表)

    这似乎并不难理解,再进一步描述一下。
    看看下面这个函数声明:

    int fun(int x,int y);
    

    这种函数应该都很熟悉,其实就是一个函数,然后返回值是一个 int 类型,是一个数值。
    接着看下面这个函数声明:

    int *fun(int x,int y);
    

    这和上面那个函数唯一的区别就是在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针,是一个地址。

    这样描述应该很容易理解了,所谓的指针函数也没什么特别的,和普通函数对比不过就是其返回了一个指针(即地址值)而已。

    指针函数的写法

    int *fun(int x,int y);
    int * fun(int x,int y);
    int* fun(int x,int y);
    

    这个写法看个人习惯,其实如果*靠近返回值类型的话可能更容易理解其定义。

    示例

    (由于本人习惯于 Qt 中进行开发,所以这里为了方便,示例是在 Qt 工程中写的,其语法是一样的,只是输出方式不同)
    来看一个非常简单的示例:

    typedef struct _Data{
        int a;
        int b;
    }Data;
    
    //指针函数
    Data* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //调用指针函数
        Data * myData = f(4,5);
        qDebug() << "f(4,5) = " << myData->a << myData->b;
    
        return a.exec();
    }
    
    

    输出如下:

    f(4,5) =  4 5
    

    注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。
    不过也可以将其返回值定义为 void*类型,在调用的时候强制转换返回值为自己想要的类型,如下:

    //指针函数
    void* f(int a,int b){
        Data * data = new Data;
        data->a = a;
        data->b = b;
        return data;
    }
    
    调用:
    Data * myData = static_cast<Data*>(f(4,5));
    

    其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。

    函数指针

    定义

    函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
    声明格式:类型说明符 (*函数名) (参数)
    如下:

    int (*fun)(int x,int y);
    

    函数指针是需要把一个函数的地址赋值给它,有两种写法:

    fun = &Function;
    fun = Function;
    

    取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。

    调用函数指针的方式也有两种:

    x = (*fun)();
    x = fun();
    

    两种方式均可,其中第二种看上去和普通的函数调用没啥区别,如果可以的话,建议使用第一种,因为可以清楚的指明这是通过指针的方式来调用函数。当然,也要看个人习惯,如果理解其定义,随便怎么用都行啦。

    示例

    int add(int x,int y){
        return x+y;
    }
    int sub(int x,int y){
        return x-y;
    }
    //函数指针
    int (*fun)(int x,int y);
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        //第一种写法
        fun = add;
        qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
    	//第二种写法
        fun = &sub;
        qDebug() << "(*fun)(5,3) = " << (*fun)(5,3)  << fun(5,3);
    
        return a.exec();
    }
    
    

    输出如下:

    (*fun)(1,2) =  3
    (*fun)(5,2) =  2 2
    

    上面说到的几种赋值和调用方式我都分别使用了,其输出结果是一样的。

    二者区别

    通过以上的介绍,应该都能清楚的理解其二者的定义。那么简单的总结下二者的区别:

    定义不同

    指针函数本质是一个函数,其返回值为指针。
    函数指针本质是一个指针,其指向一个函数。

    写法不同

    指针函数:int* fun(int x,int y);
    函数指针:int (*fun)(int x,int y);
    可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。
    再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

    用法不同

    上面已经写了详细示例,这里就不在啰嗦了。

    总而言之,这两个东西很容易搞混淆,一定要深入理解其两者定义和区别,避免犯错。

    另外,本文都是针对普通函数指针进行介绍,如果是C++非静态成员函数指针,其用法会有一些区别,在另外一篇博客中单独介绍,文章在这里

    展开全文
  • MySQL WHILELOOPREPEAT循环的用法区别 MySQL三种循环的区别 MySQL循环使用方法 一、MySQL循环概述 MySQL中有三种循环,分别是 WHILE , REPEAT , LOOP (据说还有 goto),不可单独使用,主要用于 存储过程 ...

    MySQL WHILE和LOOP和REPEAT循环的用法区别 MySQL三种循环的区别 MySQL循环使用方法 

     

    一、MySQL循环概述

    MySQL中有三种循环,分别是 WHILE , REPEAT , LOOP (据说还有 goto),不可单独使用,主要用于 存储过程 PROCEDURE 和 函数 FUNCTION 中。

     

    二、WHILE 循环

    1、语法: WHILE condition DO doSomething END WHILE ;

    2、说明: condition 条件满足情况下,则执行循环体内容,不满足,则结束循环。(如:2>1,满足;1<2,不满足。) --- 先判断,后执行。

    3、示例: 创建 while 循环的存储过程 pro_while

    DROP PROCEDURE IF EXISTS pro_while ;
    CREATE PROCEDURE pro_while()
    BEGIN
    	 DECLARE  sum INT DEFAULT 0 ;
    	 WHILE sum < 100 DO
    		INSERT INTO `chapter`.`batch` (`id`, `name`, `age`) 
    		VALUES (CONCAT(sum,''),CONCAT('while',sum) , sum);
    		SET sum = sum + 1;
       	END WHILE ;
    END;

     

    4、调用存储过程: CALL pro_while();

     

    三、REPEAT 循环

    1、语法: REPEAT doSomething UNTIL condition END REPEAT ;

    2、说明:doSomething 先执行相关操作 ,再判断是否满足条件,满足,结束循环。(和WHILE循环相反) --- 先执行,后判断。

    3、示例:创建 repeat 循环的函数 fun_repeat

    DROP FUNCTION IF EXISTS fun_repeat ;
    CREATE FUNCTION fun_repeat() RETURNS INT
    BEGIN
    	DECLARE  sum INT DEFAULT 1000 ;
    		REPEAT 
    			INSERT INTO `chapter`.`batch` (`id`, `name`, `age`) 
    			VALUES (CONCAT(sum,''),CONCAT('repeat',sum) , sum);
    			SET sum = sum + 1;	
    		UNTIL sum > 1100 END REPEAT ; -- 满足条件结束循环
    	RETURN 1;
    END;

     

    4、执行函数: SELECT fun_repeat();

     

    四、LOOP 循环

    1、语法:

    loop_name : LOOP
        IF condition THEN
            LEAVE loop_name ;
        END IF;
        doSomething
    END LOOP;

     

    2、说明:

    • loop_name 为循环名字,自定义,不可用关键字。
      • doSomething 执行的相关操作。
      • condition 满足条件,则结束循环。--- 先判断,后执行。

     

    3、示例:创建 loop 循环的存储过程 pro_loop

    DROP PROCEDURE IF EXISTS pro_loop ;
    CREATE PROCEDURE pro_loop()
    BEGIN
    	DECLARE sum int DEFAULT 10000 ;
    	loop_sums : LOOP -- 【开始】loop 名字,自定义
    		IF sum > 10100 THEN
    			LEAVE loop_sums ; -- 满足条件,则结束循环
    		END IF; 
    		INSERT INTO `chapter`.`batch` (`id`, `name`, `age`) 
    		VALUES (CONCAT(sum,''),CONCAT('loop',sum) , sum);
    		SET sum = sum + 1;	
    	END LOOP ;  -- 【结束】
    END ;

     

    4、调用存储过程: CALL pro_loop();

     

    五、总结

    1、WHILE 循环,先判断,后执行。满足条件,执行,执行循环。

    2、REPEAT 循环,先执行,后判断。满足条件,不执行,结束循环。

    3、LOOP 循环,先执行,后判断。满足条件,不执行,结束循环。

    4、当条件为false时,REPEAT循环也能执行一次,类似于 java中的 do {} while (condition); 循环; 而 WHILE、LOOP 循环无法执行。

    5、以上为本人自己总结的,若有失误,欢迎指正,感谢! ^_^。

     

    了解更多...

     

    MySQL存储过程学习整理,游标使用,参数输入输出

    MyBatis调用存储过程,MyBatis调用函数的使用方法

    MySQL 创建函数

    MySQL触发器资料整理创建触发器及查看、删除触发器

    MySQL创建视图

    MySQL WHILE和LOOP和REPEAT循环的用法区别 MySQL三种循环的区别 MySQL循环使用方法

     

    展开全文
  • hive中的自定义函数 udf udafudtf的区别 以及用法 udf: 特点:input:output=1:1 实例函数:md5,split,ltrim 应用场景:1:1的情况,比如md5… 实现方法:简单udf实现 extends UDF 方法名 evaluate 举例: public ...

    hive中的自定义函数 udf 和udaf和udtf的区别 以及用法

    udf:
    特点:input:output=1:1
    实例函数:md5,split,ltrim
    应用场景:1:1的情况,比如md5…
    实现方法:简单udf实现
    extends UDF
    方法名 evaluate

    举例:
    public class Lower extends UDF {
    public Text evaluate(Text s) {
    if (s == null) {
    return null;
    }
    return new Text(s.toString().toLowerCase());

    }
    

    1.将项目打包 打包后 放到linux系统hive的默认目录【不需要上传到hdfs】【默认目录:/opt/molute/jars/ (没有的话自己创建目录)
    2.将jar包 添加到hive的classpath 【进入hive命令】【此步骤也相当于在hive上注册jar包】
    hive> add jar /opt/molute/jars/udf.jar;
    若执行成功 显示如下:
    hive> add jar /opt/module/jars/udf.jar;
    Added [/opt/module/jars/udf.jar] to class path
    Added resources: [/opt/module/jars/udf.jar]
    3.创建临时函数与开发好的 java class 关联
    create temporary function toLowerCase as ‘cn.hive.Lower’; [【’’ 里是java类的路径 toLoweCase 是起的函数名 temporary是临时的】
    4.测试 :show functions; 看我们刚才创建的hive 的自定义函数 toLowerCase 有没有
    有的话 ,我们使用toLoweCase() 函数查询我们的一张表peopeo数据试试 如:
    select toLoweCase(name) from peopeo; 结果成功 。ok 结束。

    自我小总:就是hive内部机制会自动调用evaluate方法【只要注重 参数 和返回值即可 hive中自定义的方法名 随便起 默认执行evaluate方法中的业务逻辑并返回结果 evaluate方法返回的结果就是我们自定义函数想要的结果 所以 evaluate方法不能用void修饰】

    udaf:
    特点: input:output=n:1
    示例函数:sum,count,max,min…
    实现方法:extends UDAF,内部静态类实现接口UDAFEvaluator
    五大方法:
    init:初始化map或是reduce需用到的变量
    iterate:迭代处理每条数据。true
    terminatePartial:相当于mr的combiner
    merge:其输入一定是terminatePartial的输出
    terminate:处理的是merge的结果
    具体介绍:
    init():类似于构造函数,用于UDAF的初始化
    iterate():接收传入的参数,并进行内部的轮转。其返回类型为boolean
    terminatePartial():无参数,其为iterate函数轮转结束后,返回乱转数据,iterate和 terminatePartial类似于hadoop的Combiner(iterate–mapper;terminatePartial–reducer)
    merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
    terminate():返回最终的聚集函数结果

    udtf:
    特点:input:output=1:n
    示例函数:explode
    实现方法:udf+explode

    展开全文
  • 一、原生JS forEach()map()遍历 共同点: 1.都是循环遍历数组中的每一项。 2.forEach() map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input。 3.匿名函数中的...

    转载自:小猪冒泡原生JS forEach()和map()遍历
    一、原生JS forEach()和map()遍历

    共同点:

    1.都是循环遍历数组中的每一项。
    
    2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前项的索引index,原始数组input。
    
    3.匿名函数中的this都是指Window。
    
    4.只能遍历数组。
    

    1.forEach()

    没有返回值。
     
    arr[].forEach(function(value,index,array){
     
      //do something
     
    })
    

    参数:value数组中的当前项, index当前项的索引, array原始数组;
    数组中有几项,那么传递进去的匿名回调函数就需要执行几次;
    理论上这个方法是没有返回值的,仅仅是遍历数组中的每一项,不对原来数组进行修改;但是可以自己通过数组的索引来修改原来的数组;

    var ary = [12,23,24,42,1];  
    var res = ary.forEach(function (item,index,input) {  
           input[index] = item*10;  
    })  
    console.log(res);//--> undefined;  
    console.log(ary);//--> 通过数组索引改变了原数组;
    

    2.map()

    有返回值,可以return 出来。

    arr[].map(function(value,index,array){
    
      //do something
    
      return XXX
    
    })
    

    参数:value数组中的当前项,index当前项的索引,array原始数组;
    区别:map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了);

    var ary = [12,23,24,42,1];  
    var res = ary.map(function (item,index,input) {  
        return item*10;  
    })  
    console.log(res);//-->[120,230,240,420,10];  原数组拷贝了一份,并进行了修改
    console.log(ary);//-->[12,23,24,42,1];  原数组并未发生变化
    

    every()与some()方法都是JS中数组的迭代方法。

    every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true。
    some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true。

    var arr = [ 1, 2, 3, 4, 5, 6 ]; 
    
    console.log( arr.some( function( item, index, array ){ 
        console.log( 'item=' + item + ',index='+index+',array='+array ); 
        return item > 3; 
    })); 
    
    console.log( arr.every( function( item, index, array ){ 
        console.log( 'item=' + item + ',index='+index+',array='+array ); 
        return item > 3; 
    }));
    

    运行结果:
    在这里插入图片描述

    some一直在找符合条件的值,一旦找到,则不会继续迭代下去。
    every从迭代开始,一旦有一个不符合条件,则不会继续迭代下去。

    展开全文
  • 1.localstorage: localStorage的...即使关闭浏览器,数据也不会销毁,存储大小一般为5M,需要主动去销毁,使用方法如下: var storage = null; if(window.localStorage){ //判断浏览器是否支持localStorage sto...
  • break continue 区别以及用法

    万次阅读 多人点赞 2017-11-30 20:13:13
    今天我们来介绍一下循环里的break continue的用法以及区别我们大家先记住一句话 :break 再循环中的作用是 跳出一个循环或者结束一个循环 接下来我们来写一个题目来实现一下这个break的功能。 题目:从100打印到...
  • Verilog中 regwire 用法和区别以及alwaysassign的区别

    万次阅读 多人点赞 2016-11-30 17:17:49
    1、从仿真角度来说,HDL语言面对的是编译器如modelsim,相当于使用软件思路,此时:  wire对应于连续赋值,如assign;  reg对应于过程赋值,如always,initial; 2、从综合角度,HDL语言面对的是综合器,相当于...
  • call、applybind方法用法以及区别   call、apply、bind的作用是改变函数运行时this的指向,所以先说清楚this 1、方法调用模式:   当一个函数被保存为对象的一个方法时,如果调用表达式包含一个提取属性的...
  • 下面看一下它的用法以及和indexOf的区别.  1.indexOf()用法: 直接打点调用,括号参数传需要匹配的项.如果数组中有这一项,返回此项的索引值.没有返回 -1;  2. includes()方法: 直接打点调用,括号传两个参...
  • ArrayListLinkedList区别及使用场景

    万次阅读 多人点赞 2018-09-07 18:51:40
    ArrayListLinkedList区别及使用场景 1. LinkedListArrayList的差别主要来自于ArrayLinkedList数据结构的不同。ArrayList是基于数组实现的,LinkedList是基于双链表实现的。另外LinkedList类不仅是List接口的...
  • 主要介绍了JS forEachmap方法的用法区别,结合实例形式分析了forEachmap方法的功能、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
  • 今天主要来说一下reparationcoalesce的用法和区别: 先看一下下面的代码吧: package test import org.apache.spark.{SparkConf, SparkContext} object RddTest { def main(args: Array[String]): Unit = { ...
  • python中listtuple的用法及区别

    万次阅读 多人点赞 2017-12-06 16:32:06
    listtuple的用法及区别
  • const#define的用法及区别
  • appendappendTo的区别以及js中的appendChild用法 很多像我一样接触JS没多久的小白对appendappendTo的区别以及js中的appendChild用法都会有所模糊,下面对这个进行详细区分: appendappendTo的区别: ...
  • HttpServletRequestServletRequest都是接口 HttpServletRequest继承自ServletRequest  HttpServletRequest比ServletRequest多了一些针对于Http协议的方法。 例如: getHeader(), getMethod() , ...
  • java replacereplaceAll的区别以及用法

    万次阅读 多人点赞 2017-04-25 09:56:31
    replacereplaceAll是JAVA中常用的替换字符的方法 public String replace(char oldChar, char newChar) 在字符串中用newChar字符替代oldChar字符,返回一个新的字符串 public String replaceAll(String ...
  • excute、excuteQueryexcuteUpdate的使用方法以及区别  在写一个简单的图书管理系统时,遇到了要执行的SQL语句,两句,如下:  int i = stmt.executeUpdate(sql);  ResultSet i = stmt.executeQuery(sql);  ...
  • Python中 rstrip() 的用法 以及和 strip() 的区别

    万次阅读 多人点赞 2019-03-02 20:43:08
    我们经常会用到 strip() 函数来去除字符串或者字段前后的空格,但其实还有一个函数 rstrip(),是用来删除字符串末尾的指定字符(默认为空格),那这两个函数有什么区别呢,rstrip()又怎么使用呢? 2. rstrip() 2.1 ...
  • printfputs的用法及区别

    千次阅读 2017-11-30 14:47:39
    首先来介绍下printfgets的用法 printf用法: printf的用法和scanf一样,只是scanf是用于输入而printf用于输出。 在上篇已经介绍过scanf的用法,这里就不做介绍了。 再看puts: puts是gets的对立,gets用于输入...
  • group byorder by的用法和区别

    万次阅读 多人点赞 2018-08-18 14:10:14
    一、order by的用法 使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;降序:DESC;默认为升序)。 当排序列含空值时: ASC:排序列为空值的元组最后显示。 DESC:排序列为...
  • def test(model, test_loader): model.eval() # ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,451,997
精华内容 980,798
关键字:

以及的用法和及的区别