赋值

C++函数指针总结

巧了我就是萌 提交于 2020-01-24 07:05:14
  学习c++的过程中,指针是难点,熟悉了指针之后,还有一个让人很蛋疼的难点,那就是函数指针了。本博文详细介绍一下常见的各种坑爹的函数指针。   至于指针的详细学习,推荐这篇博文 C++指针详解   与数据一样,函数也有地址,函数的地址就是内存中存放函数语言代码的起始地址。函数指针就是指向这个地址。函数指针所指向的类型,就是函数本身。我们知道,指针所指向类型代表了指针所指向的内存区域的大小。所以函数指针所指向的类型,就是函数在内存中所占据内存的大小。知道了函数的起始地址和大小,所以函数指针可以很轻易的代替函数完成函数调用。 一、最简单的函数指针   变量都包括声明和赋值,指针不例外,函数指针也不例外。我们来看一个简单的函数: void add(int a, int b){ cout << a + b << endl; }   一个简单的加法计算并输出到命令行的函数。   那么如何通过函数指针来调用它呢?   1、声明: void (*p1)(int a, int b);   函数指针的声明很简单,基本就是通过一个指针把函数名替换。指针p1的类型为void (*) (int a,int b),表明指针是一个指向某个函数的指针,指针指向的类型为void () (int a,int b)   2、赋值: p1 = add;   3、也可以直接定义: void (*p1)(int a,

数组操作解析

血红的双手。 提交于 2020-01-24 00:24:08
数组操作解析: var arr = [1, 3, 5, 7, 4]; brr=arr; //简单类型存储的是值本身,复杂类型存储的是地址, //如果把第一个对象赋值给另一个变量,此时两个变量会指向同一个对象。 //如果修改对象里面的键值对,对应的变量都会改变 arr[6] = "w";//如果下标是已经存在的,那赋值操作就是修改数组元素的值,如果下标是不存在,那赋值操作就给数组添加元素。 console.log(arr,brr)//arr= [1, 3, 5, 7, 4, empty, "w"]; brr= [1, 3, 5, 7, 4, empty, "w"]; var crr=arr.reverse()//反转数组,返回新数组 var drr=brr.concat(crr); console.log(drr) //["w", empty, 4, 7, 5, 3, 1, "w", empty, 4, 7, 5, 3, 1] 上面例子中涉及了数组操作的两个知识点: 1,数组的存储空间(栈内存和堆内存,有时间再整理,两者的区别),在这里只是简单的理解。简单类型传递值,复杂类型传递地址。如果把第一个对象赋值给另一个变量,此时两个变量会指向同一个对象。如果修改对象里面的键值对,对应的变量都会改变 2,数组基本操作。 push : 从后面添加元素,返回新数组的length。 pop:

菜鸟学习JavaScript

落花浮王杯 提交于 2020-01-23 18:00:34
一.基本语法 JavaScript的语法和Java语言类似,每个语句以;结束,语句块用{…}。但是,JavaScript并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上;。 例如,下面的一行代码就是一个完整的赋值语句: var a = 1 ; 注释 以//开头直到行末的字符被视为行注释,注释是给开发人员看到,JavaScript引擎会自动忽略: // 这是一行注释 alert ( 'hello' ) ; // 这也是注释 另一种块注释是用/ … /把多行字符包裹起来,把一大“块”视为一个注释: /* 从这里开始是块注释 仍然是注释 仍然是注释 注释结束 */ 警告 JavaScript语句严格区分大小写 二.数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在JavaScript中定义了以下几种数据类型: 1.Number JavaScript不区分整数和浮点数,统一用Number表示,以下都是合法的Number类型: 123 ; // 整数123 0.456 ; // 浮点数0.456 1.2345e3 ; // 科学计数法表示1.2345x1000

Java JVM 从程序员的角度看对象初始化过程,变量加载顺序及内存分配

你说的曾经没有我的故事 提交于 2020-01-22 22:49:31
专栏原创出处: github-源笔记文件 , github-源码 ,欢迎 Star,转载请附上原文出处链接和本声明。 Java JVM-虚拟机专栏系列笔记,系统性学习可访问个人复盘笔记-技术博客 Java JVM-虚拟机 一、前言 前面我们分析过 从虚拟机的角度看对象的创建与访问 。 现在我们站在程序员角度,来看一下我们定义的一个个类及类里面的成员变量是怎么初始化的,分别什么时候初始化,以及初始化顺序和内存分配。 公网上的文章写一堆代码打印一些信息进行分析,有些把语句块的加载顺序都下结论了,这种理解对于初学者来说可行,但是随着深入的学习我们应该试着从虚拟机角度去分析整个过程。 本文从字节码及类加载过程结合虚拟机内存模型进行分析,无需进行大量源码打印,愿意验证的朋友可以采用该方法进行更复杂的初始化过程分析。 首先我们统一一下概念: 类变量,表示 static 修饰的成员变量 类常量,表示 static final 修饰的基本数据类型与字符串成员变量 静态语句块,使用 static{} 包起来的语句块 实例变量,表示随着类初始化而初始化的成员变量 实例构造器语句块,使用 {} 包起来的语句块 class Father { // 类常量 public static final String STATIC_FINAL = "static-final-Father" ; // 类变量

C++中构造函数,拷贝构造函数和赋值函数的区别和实现

不羁的心 提交于 2020-01-22 00:59:57
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它被调用来对类的数据成员进行初始化和分配内存。(构造函数的命名必须和类名完全相同) 首先说一下一个C++的空类,编译器会加入哪些默认的成员函数 ·默认构造函数和拷贝构造函数 ·析构函数 ·赋值函数(赋值运算符) ·取值函数 **即使程序没定义任何成员,编译器也会插入以上的函数! 注意:构造函数可以被重载,可以多个,可以带参数; 析构函数只有一个,不能被重载,不带参数 而默认构造函数没有参数,它什么也不做。当没有重载无参构造函数时, A a就是通过默认构造函数来创建一个对象 下面代码为构造函数重载的实现 <span style="font-size:14px;">class A { int m_i; Public: A() { Cout<<”无参构造函数”<<endl; } A(int i):m_i(i) {} //初始化列表 }</span> 2.拷贝构造函数 拷贝构造函数是C++独有的,它是一种特殊的构造函数,用基于同一类的一个对象构造和初始化另一个对象。 当没有重载拷贝构造函数时,通过默认拷贝构造函数来创建一个对象 A a; A b(a); A b=a;

WPF:XAML概述

坚强是说给别人听的谎言 提交于 2020-01-22 00:29:53
简介 XAML是eXtensible Application Markup Language可扩展应用程序 标记语言 ,它是 微软公司 为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,而 这种实现方式和ASP.NET中的"代码后置"模型非常类似 。XAML是一种解析性的语言,尽管它也可以被编译。它的优点是简化编程式上的用户创建过程,应用时要添加代码等。 XAML并不是HTML。尽管XAML在元素的声明、程序样式的设置和指定事件处理程序上都和HTML非常类似,但是 XAML是基于XML的,它是WPF的外在表现形式 。而HTML只是一种 标记语言 ,仅仅是用来为浏览器呈现页面内容。 XAML除了用来呈现信息和请求用户输入等基本的功能外,它还包含了一些高级的特性,例如它提供了对动画和3D众多方面的支持 。另外, 是和HTML不同的是, XAML是强类型化的。 也就是说,HTML会忽略那些它不能识别的元素和属性,而XAML必须在识别所有的元素和属性的情况下,才对页面进行呈现。尽管在XAML中各个属性都是以一个个的字符串(例如Background)表示的,但是这些字符串实际上代表的是WPF中的对象,只有被WPF识别的对象才可以作为元素的属性,所以我们说XAML是强类型化的。 XAML是可扩展的,正如它的名字指明的那样

堆溢出

我是研究僧i 提交于 2020-01-21 23:58:24
1.申请一个堆区; 2.连续申请3个大小一样的堆块H1 H2 H3; 3.释放H1 H3; 4.申请同大小的H4 当发生再次申请同样空间大小的h4时 依据最优匹配原则,空闲块h3将被摘下提交给程序进行管理。 堆溢出的关键点就在这里!我们仔细看看摘除H3是具体怎样实现的,我们先来看看H3的Blink指向的是H1的Flink,H3的Flink存放的是堆表某一项的Blink地址,通过赋值:[H3.Blink] <- H3.Flink,正常情况下,通过此赋值,将会完成H3的分配工作; 这是简单的正常分配过程,那溢出利用是怎样发生的呢? 假设在释放H1 H3后,申请H4前, 我们通过对H2数据区进行溢出赋值,内容A, B分别覆盖了H3中的Flink和Blink字段,我们看看会出现什么结果。 在申请H4发生时将触发[H3.Blink] <- H3.Flink赋值操作,然而由于溢出的发生,将变成[B] <- A 这个A我们就可以改成shellcode的起始地址,B可以改成重要函数的调用地址,当相应函数调用发生时,即可跳去执行shellcode。 来源: CSDN 作者: 跃然实验室 链接: https://blog.csdn.net/dyxcome/article/details/104066099

《你不知道的javascript·上》笔记

匆匆过客 提交于 2020-01-21 19:03:51
作用域是什么 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元 解析/语法分析 词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树(抽象语法树AST) 代码生成 将AST转换为可执行代码的过程称被称为代码生成 理解作用域 处理成员 引擎——负责代码编译和执行 编译器——词法-语法-代码生成 作用域——根据名称查找变量的一套规则 引擎查询(代码执行前) 一个赋值操作的LHS(左侧)和RHS(右侧)查询 var a = 0 LHS-a,RHS-0 console.log(a) LHS-无,RHS-log和a 如果查找的目的是对变量进行赋值,就会使用LHS查询 如果查找的目的是获取变量的值,就会使用RHS查询 词法作用域 词法阶段 定义在词法阶段的作用域,由你在写代码时将变量和块作用域写在哪里来决定的,执行时不变,因此该词法作用域属于静态作用域(相对于动态作用域) 无论函数在哪里被调用,也无论它如何被调用,它的词法作用域都只由函数被创建时所处的位置决定 词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的(javascript的this也是) 词法作用域关注函数在何处声明,而动态作用域关注函数从何处调用 欺骗词法 eval——修改词法 with——创建词法 性能

05.js函数下集

一世执手 提交于 2020-01-21 16:48:29
函数(下) 作用域(重点) 什么是作用域,就是一个变量可以生效的范围 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域 全局作用域 全局作用域是最大的作用域 在全局作用域中定义的变量可以在任何地方使用 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window 这个作用域会一直存在,直到页面关闭就销毁了 // 下面两个变量都是存在在全局作用域下面的,都是可以在任意地方使用的 var num = 100 var num2 = 200 局部作用域 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域 在局部作用域中定义的变量只能在这个局部作用域内部使用 在 JS 中只有函数能生成一个局部作用域,别的都不行 每一个函数,都是一个局部作用域 // 这个 num 是一个全局作用域下的变量 在任何地方都可以使用 var num = 100 function fn() { // 下面这个变量就是一个 fn 局部作用域内部的变量 // 只能在 fn 函数内部使用 var num2 = 200 } fn() 变量使用规则(重点) 有了作用域以后,变量就有了使用范围,也就有了使用规则 变量使用规则分为两种,访问规则 和 赋值规则 访问规则 当我想获取一个变量的值的时候,我们管这个行为叫做 访问 获取变量的规则: 首先,在自己的作用域内部查找,如果有,就直接拿来使用

Python笔记--1

这一生的挚爱 提交于 2020-01-21 16:25:37
参考:《Python带我起飞》 语言分类 1. 运行角度 编译型:利用编译器(程序)将代码 一次性 转换为二进制文件(可执行文件),在运行阶段是独立的,不再需要编译器。所以概括起来,编译型语言的运行过程为: 编写代码–>编译所有代码–>运行所有代码 . 属于编译型的语言包括 C/C++,Pascal/Object Pascal(Delphi) 解释性:每次读取 一行 源程序,将该行代码转换成二进制代码,然后执行该二进制代码。所以解释性语言的运行过程为: 编写代码–>解释一行代码–>运行一行代码–>解释一行代码–>运行一行代码–>…–>解释最后一行代码–>运行最后一行代码 . 属于解释性的语言包括 Java、JavaScript、VBScript、Perl、Python、Ruby、Matlab 如此看来,编译型语言和解释性语言的本质区别就好像两种生活态度:全部准备好再去做事,一边准备一边做事。我原来偏向于前者,现在则偏向于后者(个人观点)。 两者的其他区别 运行速度 编译型运行速度较快,解释性运行速度较慢;可以这样考虑,运行速度指的是运行代码的速度,编译型的语言其编译阶段不包括在运行时间内,而且一次编译结束后形成可执行文件,之后再运行这段代码时就不需要再次编译了,直接运行之前编译好的可执行文件就可以了,即除第一次外,每次都可以直接运行代码。所以速度较快。而解释型语言