指针初始化

C++变量和基本类型知识概要总结

烂漫一生 提交于 2020-02-26 15:38:40
整合基本的关于c++的变量和基本类型的知识。参考于C++primer第二章 仅包含部分,而非全部 inti=b; //i的值为1 i= 3.14; //i的值为3 double pi = i; // pi的值为3.0 unsigned char C = - 1; //假设char占8比特,c的值为255 signed char c2 = 256; //假设char占8比特,c2的值是未定义的 注意:当我们赋给无符号类型一个超过它表示范围的值时,结果就是初始值对无符号类型所表示的数值总值取模后的余数。 举个清新易懂的例子 例如:八比特大小的unsigned char 可以表示0至255区间内的值,如果赋了一个区间以外的值,则实际值就是该值对256取模后所得的余数。-1赋值给unsigned char的结果时255. 但是 !!赋值给有符号类型超过它表示范围的值时,结果就是未定义的。程序可能继续工作,可能崩溃,也可能产生垃圾数据。 int类型的加了一个无符号值时,int会先变成无符号类型然后再操作。 若两个无符号相减后变成负数了,结果会是取模后的值 ‘A’ 和 "A"是有区别的,'A’就是一个单独的字符A,而"A"则代表了一个字符的数组,包含两个字符,一个是字母A ,另一个是空字符。 对于C++程序员来说,变量和对象一般可以互换使用 初始化不是赋值

28-指针的定义和初始化

牧云@^-^@ 提交于 2020-02-26 05:28:10
本节知识点: 1、指针变量 2、定义一个指针变量 3、指针变量的引用 4、指针变量的初始化方法 5、使用*获取指针对应存储区域的内容 ---------------------------------------------------------------------------------------------------- 1、指针变量    在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。   因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。 注意,严格意义上讲:    指针 是一个地址, 是一个常量。    指针变量 是存放一个地址, 是一个变量。 指针变量用于存放指针(地址)。 对比整型数据理解:int a = 10;   10 是一个整型数据, 是一个常量   整型变量a是存放整型数据的,是一个变量。 图中:变量i_pointer 就是一个指针变量,查看k = i + j; 的存储过程 2、定义一个指针变量 对指针变量的定义包括3个内容:   (1) 指针类型说明,即定义变量为一个指针变量   (2) 指针变量名   (3) 变量值(指针) 一般形式为: 类型说明符 *变量名 可以理解为 (类型说明符 *)变量名   其中, 这里的*只具有象征意义,仅表示这是一个指针变量 ,变量名即为定义的指针变量的名称

依赖注入

假装没事ソ 提交于 2020-02-26 00:11:02
一、简介 依赖注入可以通过初始化方法(或构造函数)传递所需要的参数,或者通过属性(setter)传递。这里将对这两种方法进行讲解。 初始化方法注入: - (instancetype)initWithDependency1:(Dependency1 *)d1 dependency2:(Dependency2 *)d2; 属性注入: @property (nonatomic, retain) Dependency1 * dependency1; @property (nonatomic, retain) Dependency2 * dependency2; 一般更趋向于初始化注入,如果在初始化(构造函数)的时候没办法进行注入,才通过属性进行注入。在通过初始化注入的情况下,这些依赖可能仍然需要作为属性存在,但是这些属性应该被设置为只读(readonly)的。 二、为什么使用依赖注入 依赖注入的几个重要之处: ①、明确的定义。使用依赖注入很明确的告诉了使用者要操作这个类对象需要做什么事情,初始化哪些变量,并且可以隐藏一些危险的依赖,如全局变量; ②、使用构成。 即一直坚持的 多构成少继承原则 。它能提高代码的可重用性; ③、更简单的自定义。在创建一个对象的时候通过传入指定的参数,更容易自定义。 ④、明确的所有者。 ⑤、可测试性。因为只需根据初始化方法,传入需要的参数即可进行操作

static关键字

泪湿孤枕 提交于 2020-02-24 00:10:20
http://hi.baidu.com/helfen/blog/item/d6d208dba1d1146ed0164e29.html // C++ static 类的静态成员函数 #include <iostream.h> class ok { int a; static int s;//声明静态数据成员 public: ok(int a); static void show();//声明静态成员函数 }; int ok::s=0;//定义并初始化静态数据成员 ok::ok(int a) { this->a=a; s+=a; //非静态成员函数可以访问静态数据成员 } void ok::show() //静态成员函数的实现 { //cout<<a<<endl; //错误代码,a是非静态数据成员 cout<<"s="<<s<<endl; } void main() { ok cat(2); cat.show(); ok dog(3); dog.show(); ok::show(); } /*------------------------------------------------------------ ○静态成员之间可以相互访问,如静态成员函数访问静态数据成员和静态成员函数; ○静态成员函数没有this指针。无法访问属于类对象的非静态数据成员和非静态成员函数,

JVM解毒——类加载子系统

我的未来我决定 提交于 2020-02-22 12:39:07
带着问题,尤其是面试问题的学习才是最高效的。加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说类的加载过程吧? 我们可以自定义一个String类来使用吗? 什么是类加载器,类加载器有哪些? 多线程的情况下,类的加载为什么不会出现重复加载的情况? 什么是双亲委派机制?它有啥优势?可以打破这种机制吗? 类加载子系统 类加载机制概念 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制 。Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这里就是我们经常能见到的Class类。 类加载子系统作用 类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识(0xCAFEBABE) ClassLoader只负责class文件的加载。至于它是否可以运行,则由Execution Engine决定 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外

ConcurrentHashMap源码分析

隐身守侯 提交于 2020-02-22 11:48:17
ConcurrentHashMap解决了HashMap的线程不安全问题,在分析之前先介绍一个将HashMap线程安全的方法。利用 Collections.synchronizedMAp方法 调用内部类 SynchronizedMap HashMap<String, String> map = new HashMap<>(); Map m = Collections.synchronizedMap(map); private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable { private static final long serialVersionUID = 1978198479659022715L; private final Map<K,V> m; // Backing Map final Object mutex; // Object on which to synchronize SynchronizedMap(Map<K,V> m) { this.m = Objects.requireNonNull(m); mutex = this; } SynchronizedMap(Map<K,V> m, Object mutex) { this.m = m; this.mutex =

Go语言goroutine调度器初始化(12)

浪子不回头ぞ 提交于 2020-02-21 08:21:12
本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。 本章将以下面这个简单的Hello World程序为例,通过跟踪其从启动到退出这一完整的运行流程来分析Go语言调度器的初始化、goroutine的创建与退出、工作线程的调度循环以及goroutine的切换等重要内容。 package main import "fmt" func main() { fmt.Println("Hello World!") } 首先我们从程序启动开始分析调度器的初始化。 在分析程序的启动过程之前,我们首先来看看程序在执行第一条指令之前其栈的初始状态。 任何一个由编译型语言(不管是C,C++,go还是汇编语言)所编写的程序在被操作系统加载起来运行时都会顺序经过如下几个阶段: 从磁盘上把可执行程序读入内存; 创建进程和主线程; 为主线程分配栈空间; 把由用户在命令行输入的参数拷贝到主线程的栈; 把主线程放入操作系统的运行队列等待被调度执起来运行。 在主线程第一次被调度起来执行第一条指令之前,主线程的函数栈如下图所示: 了解了程序的初始状态之后,下面我们正式开始。 程序入口 在Linux命令行用 go build 编译hello.go,得到可执行程序hello,然后使用gdb调试,在gdb中我们首先使用 info files 命令找到程序入口(Entry point

C++ Primer Plus第6版18个重点笔记

╄→尐↘猪︶ㄣ 提交于 2020-02-21 06:32:43
下面是我看《C++ Primer Plus》第6版这本书后所做的笔记,作为备忘录便于以后复习。 笔记部分 C++的const比C语言#define更好的原因? 首先,它能够明确指定类型,有类型检查功能。 其次,可以使用C++的作用域规则将定义限制在特定的函数或文件中。 第三,可以将const用于更复杂的类型,比如数组和结构。 C语言中也有const,其与C++中const的区别是: 一是作用域规则不同;另一个是,在C++中可以用const值来声明数组长度。 不能简单地将整数赋给指针,如下所示: int *ptr; ptr = 0xB8000000; // type mismatch 在这里,左边是指向int的指针,因此可以把它赋给地址,但右边是一个整数。您可能知道,0xB8000000是老式计算机系统中视频内存的组合段偏移地址,但这条语句并没有告诉程序,这个数字就是一个地址。在C99标准发布之前,C语言允许这样赋值。但C++在类型一致方面的要求更严格,编译器将显示一条错误消息,通告类型不匹配。要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型: int *ptr; ptr = (int *) 0xB8000000; // type now match 这样,赋值语句的两边都是整数的地址,因此这样赋值有效。 注意

C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 3

戏子无情 提交于 2020-02-19 01:05:09
Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的实现做出了性能上的要求,所以,在一般的应用场合,标准库类型都有足够的效率。 2. 当用一个字符串字面值初始化string对象时,除了最后那个空字符外其他所有的字符都会被拷贝到新创建的string对象中去。 3. 如果使用等号初始化一个变量,实际上执行的是拷贝初始化。如果不使用等号,则执行的是直接初始化: string s1 = "hi, ya"; // 拷贝初始化 string s2(10, 'c'); // 直接初始化 4. 在执行读取string的操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,直到遇见下一处空白为止: // 如果我们输入" Hello World! ",输出将是"Hello",没有任何空格 string s; cin >> s; cout << s << endl; 5. string::size_type是一个无符号类型的值,而且能足够存放下任何string对象的大小。需要注意的是,string类的size函数的返回值类型是string::size_type,由于它是一个无符号类型的值

单片机启动文件

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-17 14:47:58
初始化堆栈指针SP 初始化PC指针 初始化中断向量表 配置系统时钟 调用C库函数_main,最终去到C的世界 启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户c代码之前。上电后,arm处理器处于arm态,运行于管理模式,同时系统所有中断被禁止,pc到地址0处取指令执行。一个可执行映像文件必须有个入口点,而能放在rom起始处的映像文件的入口地址也必须设置为0.在汇编语言中,我们已经说过怎样定义一个程序的入口点,当工程中有多个入口点时,需要在连接器中使用-entry指出程序的入口点。如果用户创建的程序中,包含了main函数,则与c库初始化代码对应的也会有个入口点。 总的来说,启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、i/o等;二是初始化c库和用户应用程序。在第一阶段,启动代码的人物可以描述为: (1)建立中断向量表; (2)初始化存储器; (3)初始化堆栈寄存器; (4)初始化i/o以及其他必要的设备; (5)根据需要改变处理器的状态。 -->建立中断向量表 初始化代码必须建立好中断向量表,以备应用程序后续使用。如果系统的地址0处是rom,则中断向量表直接是一些跳转指令就可以了,他们转到相应的中断处理函数执行。如果系统的0地址处不是rom,则中断向量表是通过动态的方式创建的,这主要是通过存储器映射的方式来实现:即上电后