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

    万次阅读 多人点赞 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循环使用方法

     

    展开全文
  • Synchronize Lock 的区别与用法

    千次阅读 2015-08-03 21:18:23
    Synchronize Lock 的区别与用法

    一、synchronized和lock的用法区别

     
    (1)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
     
    (2)lock(显示锁):需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对 象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
     

    二、synchronized和lock性能区别

     
    synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。因为 这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但 是到了Java1.6,发生了变化。synchronize在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致 在Java1.6上synchronize的性能并不比Lock差。
     

    三、synchronized和lock机制区别


    (1)synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁意味着其 他线程只能依靠阻塞来等待线程释放锁。
    (2)Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就 是CAS操作(Compare and Swap)。
     
    展开全文
  • break continue 区别和用法

    万次阅读 多人点赞 2019-05-10 15:32:19
    break continue 区别和用法的视频教程:https://ke.qq.com/course/149432?tuin=57912c43 ...想搞清楚break continue的用法以及区别必须要记住的两件两句话!我们大家先记住一句话 :break 再循环...

    break 和continue 区别和用法的视频教程:https://ke.qq.com/course/149432?tuin=57912c43

    有技术问题或者面试方面想学习交流的加我个人微信renlliang2013,本人建了一个微信答疑群,有学习疑问的同学加我拉你进群。

    想搞清楚break 和continue的用法以及区别必须要记住的两件两句话! 
    我们大家先记住一句话 :break 再循环中的作用是 跳出一个循环或者结束一个循环 
    接下来我们来写一个题目来实现一下这个break的功能。 
    题目:从100打印到0 是7的倍数并且求出最大值是多少

    输出的答案是98 
    在这里我们用了break 那我们看一下不用break是什么样子的

    输出的答案是98,91,84,77,70,63,56,49,42,35,28,21,14,7,0, 
    我们直观的看到了 有break和没有break的区别。 
    所以说“break再循环中的作用是 跳出一个循环或者结束一个循环

    那好下面我们再看一下continue再循环中起的是什么做作用

    还是还请大家记住一句话: 看到continue立即结束本次循环,继续执行下一次循环 
    我们在一起写一个题目 题目如下: 
    小明在班级的时候 和喜欢的人打招呼 和不喜欢的人不打招呼。他们班级一共有十个人。 
    小明分别讨厌 3 5 7这三个人 请用循环写出小明只和喜欢的人打招呼和不喜欢的人不打招呼。

    输出的结果是:1早上好,2早上好,4早上好,6早上好,8早上好,9早上好。 
    下面我们不用continue来写一次看看

    输出的结果是:1早上好,2早上好,3早上好,4早上好,5早上好,6早上好,7早上好,8早上好,9早上好。 
    9早上好, 
    上面两个例子我们不难看出来,continue 题目中所起到的作用 就是上面的那一句话: 
    看到continue时立即结束本次循环,继续执行下一次循环。

    总结

    break 和continue 他们的区别就是 , break是直接结束循环, 而continue呢,他不是直接结束本次循环而是跳过循环,继续执行下一次的循环。 
    所以说想在某一个时刻停止一个循环的时候直接用break 简单粗暴不解释! 
    但是你要想不想停止正循环想让循环再某一时刻不执行某个阶段然后还能继续执行剩下的程序那自然要用到continue了!

     

    break 和continue 区别和用法的视频教程:https://ke.qq.com/course/149432?tuin=57912c43

    有技术问题或者面试方面想学习交流的加我个人微信renlliang2013,本人建了一个微信答疑群,有学习疑问的同学加我拉你进群。


    --------------------- 

    转自原文:https://blog.csdn.net/qq_36390044/article/details/78680383 

    展开全文
  • mapfilter使用方法与区别

    千次阅读 多人点赞 2019-03-03 15:54:35
    对于mapfilter有时候傻傻分不清楚,不管jquery,只说js中的两方法,map()filter()都是对调用他们的数组进行遍历。 首先熟悉一下他们的使用方法: arr.map(function (item,index,array){……}) arr.filter...
  • 本文将会对两者进行分析,记录他们的用法和区别。 CountDownLatch CountDownLatch是一非常实用的多线程控制工具类,称之为“倒计时器”,它允许一或多线程一直等待,直到其他线程的操作执行完后再执行。 ...
  • Qt中QTimertimerevent的区别与用法

    千次阅读 多人点赞 2019-07-29 14:23:37
    为了全面性,顺带介绍使用QTimer实现定时执行的常用方法,并结合代码示例。 QTimer常见用法 QTimer实现定时执行的方法想必大家都无比熟悉,直接上代码进行说明。 QTimer的普遍用法如下,示例中使用QTimer每隔10s调用...
  • @RequestParam@PathVariable的用法与区别

    万次阅读 多人点赞 2018-12-13 10:14:30
    SpringBoot——@PathVariable URL变量 Web应用中的URL通常不是一成不变...我们不能对于每一用户都编写一被@RequestMapping注解的方法来处理其请求,也就是说,对于相同模式的URL(例如不同用户的主页,他们...
  • Position属性四取值用法和区别

    千次阅读 2018-08-11 18:42:17
    Position属性四取值用法和区别 在初学css的过程中常常会碰到设置定位的问题,大多数初学者都是大概明白,如果不好好弄清楚将会给以后的开发带来困难,经过本小菜对其他文章的浏览,自我总结如下: 目录 ...
  • mybatis中#{}${}的区别与用法

    千次阅读 2017-05-28 14:53:52
    mybatis中#{}${}的区别与用法mybatis中和的区别与用法 两者区别 两者用法 测试类两者区别#{}表示一占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型jdbc类型转换。 #{}可以有效...
  • ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...开发工具关键技术:Adobe Dreamweaver CC 2017,JavaScript 作者:袁志彤 撰写时间:2019-01-16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...
  • group byorder by的用法和区别

    万次阅读 多人点赞 2018-08-18 14:10:14
    一、order by的用法 使用order by,一般是用来,依照查询结果的某一列(或多列)属性,进行排序(升序:ASC;降序:DESC;默认为升序)。 当排序列含空值时: ASC:排序列为空值的元组最后显示。 DESC:排序列为...
  • WNDCLASS中cbClsExtracbWndExtra区别及其用法
  • mysql 中 and && 区别与用法

    千次阅读 2017-08-06 15:05:58
    CREATE FUNCTION `get_times_weeek` (  last_accting_date DATETIME,  nursePerformTime VARCHAR (50) ) RETURNS INT (11) COMMENT '计算以周为单位的计费次数'  BEGIN  DECLARE return_val INT DEFAULT 0 ...
  • break continue 区别以及用法

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

    万次阅读 多人点赞 2018-10-01 23:06:47
    单引号将其中的内容都作为了字符串来,忽略所有的命令特殊字符,类似于一字符串的用法 echo 'This is a string' &amp;gt;&amp;gt;&amp;gt; This is a string echo 'ls ./' &amp;gt;&amp;...
  • structtypedef struct的用法和区别

    千次阅读 多人点赞 2017-10-15 14:50:01
    structtypedef struct的用法和区别
  • vue.js 的 computed 方法: 计算属性是基于它们的依赖进行缓存的,只在相关依赖发生改变时它们才会重新求值。这就意味着 name url 只要还没有发生改变,多次访问 site 计算属性会立即返回之前的计算结果,而不必...
  • 存储过程函数的区别 本质上没区别,执行的本质都一样。  只是函数有如:只能返回一变量的限制。而存储过程可以返回多。   函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程要让sql的query ...
  • 一、InputStreamReader用于将一字节流中的字节解码成字符 , 用法如下 @Test public void Test19() throws Exception { InputStream in = new FileInputStream("C:/hello.txt");// 读取文件的数据,...
  • @Resource@Autowired用法区别

    万次阅读 多人点赞 2018-09-11 09:32:14
    spring中,@Resource@... 下面,根据自己的学习,整理下这两注解使用中的共同点不同点,及用法上的不同。  共同点  @Resource@Autowired都可以作为注入属性的修饰,在接口仅有单一实现类时,两...
  • 详解synchronizedLock的区别与使用

    万次阅读 多人点赞 2017-03-22 13:12:02
    于是,我整理了两者的区别和使用情况,同时,对synchronized的使用过程一些常见问题的总结,最后是参照源码说明文档,对Lock的使用写了几简单的Demo。请大家批评指正。 技术点: 1、线程进程: 在开始之前...
  • Blastp:是使用蛋白质序列蛋白质数据库中的序列进行比较,可以寻找较远的关系; Blastx:将给定的核酸序列按照六种阅读框架将其翻译成蛋白质蛋白质数据库中的序列进行比对,对分析新序列EST很有用; Tblastn:...
  • RunnableCallable的区别和用法

    万次阅读 2017-11-11 00:32:42
    创建线程的四种方式 Java多线程实现方式主要有四种:继承Thread类、实现Runnable接口、实现Callable接口通过FutureTask包装器来创建Thread线程、使用ExecutorService、Callable、Future实现有返回结果的多线程。
  • ComparableComparator的用法与区别

    千次阅读 多人点赞 2018-08-04 11:59:25
    当对自己定义的数据结构需要进行指定排序的时候,java中给了我们两接口ComparableComparator comparable接口定义一个方法: public interface Comparable&lt;T&gt; { public int compareTo(T o); }...
  • strcpy、strncpymemcpy的区别与使用方法

    万次阅读 多人点赞 2012-03-22 16:26:03
    strcpy、strncpymemcpy的区别与使用方法 strcpy、strncpy、memcpy这三C语言函数我们在主机代码编写中会很频繁的使用到,但是三函数的区别、使用时该注意什么还是有必要说下的。 本文参考《C 标准库》编写...
  • Linux命令 ls ll 的使用方法与基本区别Linux 命令 ls ll 的使用方法:ll:罗列出当前文件或目录的详细信息,含有时间、读写权限、大小、时间等信息 ,像Windows显示的详细信息。ll是“ls -l"的别名。...
  • statestatus的区别与用法

    千次阅读 2018-11-09 10:18:46
    1.枚举类型,可数,数量有限的状态一般用state; 2.不可数,不确定的状态用status; 3.物理状态、心理状态用state;...个人习惯,为了方便记忆和使用可以笼统的把遇到的可枚举的状态命名为state ...
  • hive中的自定义函数 udf udafudtf的区别 以及用法 udf: 特点:input:output=1:1 实例函数:md5,split,ltrim 应用场景:1:1的情况,比如md5… 实现方法:简单udf实现 extends UDF 方法名 evaluate 举例: public ...
  • js 中nullundefined的区别和用法

    千次阅读 2016-07-26 09:47:40
    这就侧面表现出我对nullundefined认知的不足及不自信。而每次查了资料,看过之后又给忘了,所以这里姑且做笔记! 1.null表示一对象不存在,即“没有对象”;undefined表示基本类型或对象的值没被定义,也就

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,206,495
精华内容 882,598
关键字:

个和各区别与用法