函数调用

深入学习JavaScript(二)

人盡茶涼 提交于 2020-02-21 05:38:38
函数表达式和函数声明 函数声明 function 函数名(参数){函数体} 函数表达式 function 函数名(可选)(参数){函数体} 示例: function foo(){} // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 new function bar(){}; // 表达式,因为它是new表达式 (function(){ function bar(){} // 声明,因为它是函数体的一部分 })(); 另外一种不太常见的函数表达式 function foo(){}//函数声明 (function foo(){});//函数表达式,因为在外面加上了一个分组操作符,分组操作符有一个作用是将括号中的函数声明转化成为函数表达式 //验证分组操作符内是否一定要是函数声明 try{ (var x=5); //var x=5是一个语句,不是函数声明 }catch(err){ alert(err); } 函数表达式与函数声明各自的作用? 函数声明会在函数表达式被解析和求和之前先被解析,如果是函数表达式在函数声明之前那么函数声明也会在其之前解析 示例: alert(foo()); function foo(){ return "Hello World"; } 提示:函数声明最好不要在判断语句中使用

C++(7-8章)笔记

 ̄綄美尐妖づ 提交于 2020-02-21 02:55:18
第七章 函数——C++的编程模块 7.1函数 1,函数如何返回值的? 答:函数通过将返回值复制到指定的cpu寄存器或内存单元中来将其返回。随后,调用程序将查看该内存单元。返回函数和调用函数必须就该内存单元中存储的数据的类型达成一致。函数原型将返回值类型告知调用程序,而函数定义命令被调用函数应返回什么类型的数据。 2,为什么需要原型? 答:原型描述了函数到编译器的接口,也就是说,它将函数返回值的类型(如果有的话)以及参数的类型和数量告诉编译器。 3,如果该函数不能修改形参中的数组该如何操作〉    答:可以如下:void show_array(cons tint arr[],int n); 在加上const之后表示该数组无法再sho_array()被修改,但并不是表示该数组中的所有数都是常量。 C++将const int arr[]解释为const int *arr。因此该声明实际上是说,arr指向的是一个常量值。 第八章 函数探幽 8.1 C++内联函数 1,常规函数和内联函数之间的主要区别不在于编写方式,而是在于C++编译器如何将他们组合到程序中。 2,函数执行时内部的操作方式: 编译器执行到函数调用的指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码(也许还需将返回值放入到寄存器中)

Python语言高频重点汇总

我怕爱的太早我们不能终老 提交于 2020-02-20 17:55:37
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录 Python语言高频重点汇总 **GitHub面试宝典仓库——点这里跳转** 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10. args和**kwargs 11. 面向切面编程AOP和装饰器 12. 鸭子类型 13. Python中的重载 14. 新式类和旧式类 15. `__new__`和`__init__`的区别 16. Python中的作用域 17. GIL线程全局锁 18. 协程 19. 闭包 20. lambda匿名函数 21. Python中函数式编程 22. Python中的拷贝 23. Python的垃圾回收机制 24. List 25. Python中的is 26. read, readline和readlines 27. Python2和Python3的区别 28. super init 1. 函数-传参 回到顶部 在python中,给一个函数传递参数其实是把实参这个变量对应的地址复制了一份,然后把复制的这个地址传递给函数中局部变量形参

cve-2016-0167学习笔记

馋奶兔 提交于 2020-02-20 15:07:20
主要参考了leeqwind的博客+个人理解 漏洞原理 CVE-2016-0167发生在win32k!xxxMNDestroyHandler中,漏洞发生的根本原因是win32k!xxxMNDestroyHandler在释放窗口处理消息WM_UNINITMENUPOPUP时可能被回调到用户进程,在用户回调中执行自定义的挂钩函数(hook)时可能会引起窗口对象内存区域的分配或释放。在之后的分析中我们可以看到处理消息的函数win32k!xxxSendMessageTimeout在执行完用户自定义hook之后没有检查相应内存区域的有效性直接执行了一个函数回调spwndNotify->lpfnWndProc,所以漏洞的利用思路可以是利用hook double free掉窗口内存区域,然后重新分配占位窗口内存的spwndNotify->lpfnWndProc成员域来劫持控制流进而提权。 前置知识 1.用户模式回调 传统上,win32子系统是在client-server runtime subsystem (CSRSS)的基础上实现的,客户端的线程都有一个对应的服务端线程存在,他们通过fastLPC通信。后来为了提高性能,微软将大部分服务端的组件转移到了内核模式,这就引入了win32k.sys。 这样做的好处是减少了线程切换的次数和内存需求;但是和以前直接在相同特权级别直接访问代码/数据相比,用户

dll分析

☆樱花仙子☆ 提交于 2020-02-20 07:57:56
DLL文件(Dynamic Linkable Library 即动态链接库文件),是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。 Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。 一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE

超详细的函数指针

∥☆過路亽.° 提交于 2020-02-20 07:05:35
函数指针基础 使用函数指针一般要实现: 1)获取函数地址 2)声明函数指针 3)使用函数指针调用函数 ( 1 )获取函数地址 : 直接使用函数名(函数名就是地址),比如调用think()函数: show_array ( think ) ; ( 2 )声明函数指针 int sum ( int n ) ; //(1式) int ( * p ) ( int n ) ; //(2式) p = sum ; 2 式中 ( * p ) 必须加括号, ( * p ) 相当于 1 式中的sum,那么p就是指向sum ; 否则,p函数返回的是一个指针。 ( 3 )调用函数 接着( 2 )中的示例: int x = sum ( 2 ) ; int x = ( * p ) ( 2 ) ; //这两句话是一样的! 深入探讨函数指针 int arr [ 3 ] = { 6 , 2 , 1 } ; //三个函数声明(返回类型和参数形式都是一样的): const int * f1 ( const int arr [ ] , int n ) ; const int * f2 ( const int * arr , int n ) ; const int * f3 ( const int arr [ ] , int n ) ; const int * f1 ( const int arr [ ] , int n )

Qt 多线程

我与影子孤独终老i 提交于 2020-02-20 06:10:11
Qt线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储 QMutex 提供相互排斥的锁,或互斥量 QMutexLocker 是一个便利类,它可以自动对 QMutex 加锁与解锁 QReadWriterLock 提供了一个可以同时读操作的锁 QReadLocker 与 QWriteLocker 是便利类,它自动对 QReadWriteLock 加锁与解锁 QSemaphore 提供了一个整型信号量,是互斥量的泛化 QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。 Qt线程的创建 Qt线程中有一个公共的抽象类,所有的线程都是从这个QThread抽象类中派生的,要实现QThread中的纯虚函数run(),run()函数是通过start()函数来实现调用的。 1 class MyThread : public QThread { 2 public : 3 virtual void run(); 4 }; 5 6 void MyThread::run() 7 { 8 for ( int count = 0 ; count < 20 ; count ++ ) { 9 sleep( 1 ); 10 qDebug( " Ping! " ); 11 } 12 } 13 14

C++ 内存分配(new,operator new)详解

做~自己de王妃 提交于 2020-02-20 04:12:10
参考: C++ 内存分配(new,operator new)详解 如何限制对象只能建立在堆上或者栈上 new运算符和operator new() new:指我们在C++里通常用到的 运算符 ,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个 函数 ,并不是运算符。对于operator new来说, 分为全局重载和类重载 ,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统 默认的全局 ::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针 。而构造函数的调用(如果需要)是在new运算符中完成的 new和operator new之间的关系 A* a = new A;我们知道这里分为两步: 1.分配内存,2.调用A()构造对象。 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用:

全面解析python类的绑定方法与非绑定方法

时光总嘲笑我的痴心妄想 提交于 2020-02-20 03:19:35
类中的方法有两类:  绑定方法  非绑定方法 一、绑定方法   1.对象的绑定方法   首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的。下面,我们通过实例,来慢慢解析绑定方法的应用。 class People: def __init__(self,name,age): self.name = name self.age = age def talk(self): pass p = People('xiaohua',18) print(p.talk) 输出结果: <bound method People.talk of <__main__.People object at 0x000000F802C69358>>   从上面的输出结果来看,talk()這个类中的方法,是绑定给对象使用的。下面,我在看看另外一种情况。 class People: def __init__(self,name,age): self.name = name self.age = age def talk(): pass p = People('xiaohua',18) print(p.talk) 输出结果: <bound method People.talk of <__main__.People object at 0x000000FF68F39358>>   现在

信息安全系统设计基础第十二周学习总结

牧云@^-^@ 提交于 2020-02-20 00:53:50
实践 一、实践代码总结 1. execvp()函数 函数说明: execvp()会从PATH 环境变量所指的目录中查找符合参数file 的文件名,找到后便执行该文件,然后将第二个参数argv传给该欲执行的文件。 返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。 exec1.c: (源代码中第二个printf语句消失了,原因是调用execvp函数时,内核将新程序载入到当前进程,替代当前进程的代码和数据。) exec2.c: (exec2与exec1的区别就在于,execvp函数调用的语句变成了 execvp( arglist[0] , arglist ); 编译运行结果与exec1.c完全相同,说明arglist数组的第一项为要运行的程序的名称。) exec3.c: 2. fork()函数 函数说明: 在Unix/Linux中用fork函数创建一个新的进程。进程是由当前已有进程调用fork函数创建,分叉的进程叫子进程,创建者叫父进程。该函数的特点是调用一次,返回两次,一次是在父进程,一次是在子进程。两次返回的区别是子进程的返回值为0,父进程的返回值是新子进程的ID。子进程与父进程继续并发运行。如果父进程继续创建更多的子进程,子进程之间是兄弟关系,同样子进程也可以创建自己的子进程,这样可以建立起定义关系的进程之间的一种层次关系。