指针初始化

你必须知道的指针基础-6.内存的初始化及结构体的使用

孤者浪人 提交于 2020-03-08 20:58:55
一、内存的使用 1.1 你创建的内存区域可能是脏的   当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char chs[20]; // 这个代码打印出来的可能就是乱码,因为printf的%s是“打印一直遇到'\0'”。 printf("%s\n",chs); return 0; }   其运行结果是如下图所示的乱码,因为printf的%s是“ 打印一直遇到'\0' ”。 1.2 解决脏内存区域的办法   那么,如何解决上面我们有可能会访问的脏内存区域呢?在C语言中,可以采用如下的两种方法:   (1)使用memset函数首先清理一下内存: void *memset(void *s, int ch, unsigned n); 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。   那么,我们可以使用memset函数来清理内存,即填充创建的这块内存区域: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char

Effective C++ 学习笔记

别等时光非礼了梦想. 提交于 2020-03-08 13:46:07
1. 基础部分 Item 1: View C++ as a federation of languages. 对于内建类型,按值传递优于按引用传递,对于自定义类型则相反。 C++可视为4中子语言的联合:C,Object-Oriented C++,Template C++和STL。 Item 2: Prefer consts, enums, and inlines to #defines. 只有整型常量可以在类声明里面初始化: class Klass { const static int num = 1 ; //也可只声明,在定义文件中,即类外部定义、初始化; }; enum类型也可以在类内部初始化。 Item 3: Use const whenever possible. 对于指针p,const在 * 左边时,p指向的值为常量,const出现在 * 右边时,p指向的地址为常量。 const int * p1 ; int const * p2 ; int * const p3 ; ​ //以上代码,p1和p2一样,其指向的值为常量;p3指向的地址为常量 如果类Klass有同名的两个成员函数foo,其中一个为const类型,那么const实列优先调用const版的foo。 const函数不能改变非static的成员变量。 mutable修饰的成员,在const函数中也可以改变其值。

C++: 变量和基本类型要点小结

时光怂恿深爱的人放手 提交于 2020-03-08 12:58:26
文章目录 列表初始化 声明与定义 名字的作用域 引用 空指针 auto类型说明符 decltype类型说明符 列表初始化 int a = 0 ; int a = { 0 } ; int a ( 0 ) ; int a { 0 } ; 形如 a{} 的成为列表初始化,当使用{}且存在丢失信息风险的时候,编译器会报错,例如 long double d = 3.1415926 ; int e { d } ; // 报错 int f ( d ) ; // 不报错 声明与定义 变量声明规定了变量的类型和名字,定义在此基础上还申请存储空间 变量只能被定义一次,但是可以被多次声明 extern int i ; //声明而非定义i int j ; //声明且定义j 名字的作用域 函数体之外定义:全局作用域 函数体之内定义:块作用域 允许在内层定义域 重新定义 外层已有的名字 引用 引用并非对象,他只是已有对象的别名 空指针 - C: NULL C++: nullptr auto类型说明符 不知道具体类型,可以通过初始值推断,因此 auto 定义的变量必须有初始值 decltype类型说明符 选择并返回操作数的数据类型,例如 int a = 10 ; decltype ( a ) b = 4 ; // b是int类型 来源: CSDN 作者: AmarisEx 链接: https://blog

JVM深入解析

有些话、适合烂在心里 提交于 2020-03-07 14:37:23
Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图: 1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。 2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕获的异常时,栈帧就会出栈。 (1)栈帧:栈帧存储方法的相关信息,包含局部变量数表、返回值、操作数栈、动态链接 a、局部变量表:包含了方法执行过程中的所有变量。局部变量数组所需要的空间在编译期间完成分配,在方法运行期间不会改变局部变量数组的大小。 b、返回值:如果有返回值的话,压入调用者栈帧中的操作数栈中,并且把PC的值指向 方法调用指令 后面的一条指令地址。 c、操作数栈:操作变量的内存模型。操作数栈的最大深度在编译的时候已经确定(写入方法区code属性的max_stacks项中)。操作数栈的的元素可以是任意Java类型,包括long和double,32位数据占用栈空间为1,64位数据占用2。方法刚开始执行的时候,栈是空的,当方法执行过程中,各种字节码指令往栈中存取数据。 d、动态链接

C++标准库

十年热恋 提交于 2020-03-06 09:57:18
C++总结-标准库 一、 容器 1. 顺序容器 1) 定义,初始化,赋值 初始化: a) 默认构造函数(最常用的方式) b) 用其他相同容器初始化,包括用容器本身,或用迭代器 c) 能构造拥有n相同元素容器的构造函数,包括有元素或默认元素的形式 赋值: a) 使用重载的“=”。 b) 使用容器函数assign( )。 c) 使用容器函数swap( ),具有较高的性能(事实上只交换某些内部指针),这个函数的功能是交换两个容器内的函数。 2) 操作 添加: a) 尾部插入元素,push_back( )。 b) 头部插入元素,push_front( ),只适用于list和deque。 c) 任意位置插入元素,insert( ),要指明插入的位置和插入的元素. d) 任意位置插入另个容器或容器中的元素,splice( ),只适用list 删除: a) 删除尾元素,pop_back( ) b) 删除头元素,pop_front( ),只适用于list和deque c) 删除任意位置元素,erase( ),参数是迭代器。 d) 删除特定值或判断值为true的元素,remove(), remove_if(), 只适用list e) 全部清空,clear( ) 大小: a) 获得容器中元素的个数size( ) b) 重新设定容器的大小,resize( ) c)

《C++ Primer(第五版)》第六章笔记

旧城冷巷雨未停 提交于 2020-03-06 08:53:59
6.1 函数基础   通过 调用运算符 来执行函数。函数的调用完成两项工作:用实参初始化函数的形参;将控制权转移给被调用函数。   当遇到一条 return 语句时函数结束执行过程。return 也完成两项工作:返回 return 语句中的值;将控制权从被调用函数转移回主调函数。 形参和实参   形参出现在函数定义的地方,实参出现在函数调用的地方。实参是形参的初始值,实参的类型必须与对应的形参类型相匹配。   任意两个形参都不能同名,而且函数最外层作用域中的局部变量也不能使用与函数形参一样的名字(外层局部变量被内部形参隐藏)。 6.1.1 局部对象   对象的 生命周期 是程序执行过程中该对象存在的一段时间。   形参和函数体内部定义的变量统称为 局部变量 。局部变量会 隐藏 在外层作用域中同名的其他所有声明中。   只存在于块执行期间的对象称为 自动对象 。    局部静态对象 在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。内置类型的未初始化局部变量产生未定义的值,内置类型的局部静态变量初始化(值初始化)为 0。 6.2 参数传递   形参的类型决定了形参和实参交互的方式。当形参是引用类型时,其对应的实参被 引用传递 或函数被 传引用调用 ;当实参的值被拷贝给形参时,实参被 值传递 或函数被 传值调用 。 6.2.1 传值参数  

7、uCOS-Ⅱ 信号量

时光怂恿深爱的人放手 提交于 2020-03-05 23:06:06
1、“信号量”为操作系统用于处理临界区问题和实现进程间同步提供了一种有效的机制。 在很多操作系统原理书中都提到了信号量的概念,常用P操作与V操作来表明信号量的行为。 PV操作的伪代码如下: 设s为一整数型变量: P操作:while( s==0); s--; V操作:s++ 2、例程代码 1 /***************************************************************************************************************************** 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数 5 * 文件说明:无 6 * 7 *****************************************************************************************************************************/ 8 /********************************************************** 9 * 10 * 头文件声明 11 * 12 **********************************************************/ 13 14

Java核心技术面试精讲-23/24 Java的类加载过程

元气小坏坏 提交于 2020-03-04 03:28:23
我们知道,我们写的java文件是不能直接运行的,我们可以在IDEA中右键文件名点击运行,这中间其实掺杂了一系列的复杂处理过程。这篇文章,我们只讨论我们的代码在运行之前的一个环节,叫做 类的加载 。 首先我们给出这篇文章的大致结构: 首先,认识类加载机制; 然后,详细介绍类加载的过程。 最后,说一说类加载器,以及双亲委派原则。 1.什么是类的加载 在介绍类的加载机制之前,先来看看,类的加载机制在整个java程序运行期间处于一个什么环节,下面使用一张图来表示: 从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。今天我们要讨论的就是这个环节。有了这个印象之后我们再来看类的加载的概念: 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。 到现在为止,我们基本上对类加载机制处于整个程序运行的环节位置,还有类加载机制的概念有了基本的印象。在类加载.class文件之前,还有两个问题需要我们去弄清楚: 在什么时候才会启动类加载器? 其实,类加载器并不需要等到某个类被“首次主动使用”时再加载它,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它

Item 12. 赋值和初始化(Assignment and Initialization Are Different)

拟墨画扇 提交于 2020-03-03 17:46:08
Item 12. Assignment and Initialization Are Different 是的,赋值(Assignment)与初始化(Initialization)不同,这归因于他们调用不同的函数 赋值: operator = 操作符 初始化: 拷贝构造函数 --------------------------------------------------------------- 1、什么时候调用赋值操作呢? 当然是有 “=” 的地方啦 其余的就是调用拷贝构造函数喽,例如函数传入参数的时候 2、什么时候自定义的类需要重写呢? Effective C++说,当类中有指针数据成员,并且该数据成员在类中是new出来的, 原因是按位拷贝时会发生内存泄露。 3、重写注意的问题 重写operator = 时,要将原来的内存先释放掉 详细参照E11 来源: https://www.cnblogs.com/aiwz/archive/2005/04/11/6333252.html

Item 12. 赋值和初始化(Assignment and Initialization Are Different)

ε祈祈猫儿з 提交于 2020-03-03 16:37:37
Item 12. Assignment and Initialization Are Different 是的,赋值(Assignment)与初始化(Initialization)不同,这归因于他们调用不同的函数 赋值: operator = 操作符 初始化: 拷贝构造函数 --------------------------------------------------------------- 1、什么时候调用赋值操作呢? 当然是有 “=” 的地方啦 其余的就是调用拷贝构造函数喽,例如函数传入参数的时候 2、什么时候自定义的类需要重写呢? Effective C++说,当类中有指针数据成员,并且该数据成员在类中是new出来的, 原因是按位拷贝时会发生内存泄露。 3、重写注意的问题 重写operator = 时,要将原来的内存先释放掉 详细参照E11 来源: https://www.cnblogs.com/wuwuwu/archive/2005/04/11/6335357.html