指针变量

Linux驱动之USB鼠标驱动编写

主宰稳场 提交于 2020-03-08 07:41:55
本篇博客分以下几部分讲解 1、介绍USB四大描述 2、介绍USB鼠标驱动程序功能及框架 3、介绍程序用到的结构体 4、介绍程序用到的函数 5、编写程序 6、测试程序 1、介绍USB四大描述符 USB设备驱动程序里定义了许多与驱动程序密切相关的描述符。这里介绍一下四种比较关键的描述符: 设备描述符 、 配置描述符 、 接口描述符 、 端点描述符 。这几个描述符都位于include\linux\usb\ch9.h中,先看一下每个描述直接的关系,从图中可以看出每一个查到USB主机上的USB设备都有一个设备描述符,设备描述符下面可以接多个配置描述符,配置描述符下面又可以接多个 当USB设备接到USB控制器上后,USB控制器第一次读取到的数据包,总共8字节 /*当USB设备接到USB控制器上后,USB控制器第一次读取到的数据包,总共8字节*/ struct usb_ctrlrequest { __u8 bRequestType; __u8 bRequest; __le16 wValue; __le16 wIndex; __le16 wLength; } __attribute__ ((packed)); 设备描述符 是在设备连接时,主机第一个读取的描述符,包含了主机需要从设备读取的基本信息。设备描述符有14个字段,如下所示。依照功能来分,设备描述符的字段包含了描述符本身、设备

C++引用的实现

回眸只為那壹抹淺笑 提交于 2020-03-07 19:13:30
当我学习C++引用时,听到的第一句话是“引用是变量的别名,不像指针一样需要占用内存空间”。然而学到深处,发现此话并不完全正确。 本文主要介绍我如何通过实验来了解到C++引用的实现,其实 引用的内部就是指针 。当然这也于编译器有关,所以这里需要提及一下测试所用的编译器及环境。 测试环境是MinGW的g++ 8.1.0,64位编译器,64位的机子。所以指针的大小是8个字节,即64个bit。(注:因为目的是测试,所以测试时并没有处理对new操作符所产生对象的回收) 首先我写出了如下代码,试图通过指针偏移来获取有关引用的信息: #include <iostream> #include <string> using namespace std; int main() { int64_t x; string& str = *new string(); int64_t y; str = "123"; // 对引用做一次操作,避免编译器把变量优化掉 cout << &x << endl; cout << &y << endl; return 0; } 然而,这个程序的输出如下: 0x61fe00 0x61fdf8 难道引用真的不占内存?编译器真的很聪明,可能优化掉了吧;经过一系列尝试,我写出了另外一段代码: #include <iostream> #include <string> using

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、动态链接

linux系统进程的内存布局

别来无恙 提交于 2020-03-07 14:13:29
内存管理模块是操作系统的心脏;它对应用程序和系统管理非常重要。今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕。由于不少概念是通用的,所以文中大部分例子取自32 位x86 平台的Linux 和Windows 系统。本系列第一篇文章讲述应用程序的内存布局。 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space ),在32 位模式下它总是一个4GB 的内存地址块。这些虚拟地址通过页表(page table )映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使能,那么它就会作用于这台机器上运行的所有软件,包括内核本身。因此一部分虚拟地址必须保留给内核使用: 这并不意味着内核使用了那么多的物理内存,仅表示它可支配这么大的地址空间,可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的特权级(ring 2 或以下),因此只要用户态的程序试图访问这些页,就会导致一个页错误(page fault )。在Linux 中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址的,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化:

C++之指针、引用、数组、堆区栈区

此生再无相见时 提交于 2020-03-07 12:41:28
指针 指针(pointer)是一个值为内存地址的变量(或数据对象) 基本用法 数据类型 * 指针变量名 如 int * ptr_num 注意: Int* p 写法偏向地址 P是一个地址变量 表示一个十六进制地址 Int *p偏向值 *p是一个整型变量 能够表示一个整型值 给指针赋值只能使用&符号 空指针(null pointer)空指针不指向任何对象,在试图使用一个指针之前首先检查是否为空 Int *ptr1 = nullptr; 如果用null需要包含cstdlib Void 指针 一种特殊的指针类型 可以存放任意对象的地址 注意: void 指针存放一个内存地址,地址指向的内容是什么类1、型不能确定 2、Void 类型指针一般用来:拿来和别的指针比较,作为函数的输入和输出;赋值给另一个void 指针 指针小结: 指针同样是一个变量,只不过该变量中存储的是另一个对象的内存地址 如果一个变量存储另一个对象 的地址,则称该变量指向这个对象 指针变量可以赋值 指针的指向在程序执行中可以改变 指针P在执行中某时刻指向变量x在另一时刻可以指向y 注意: 指针命名规则和其他变量命名规则一样 指针不能与现有变量重名 应为指针指定一个地址后才能在语句中使用指针 引用 为对象起了另外一个名字(引用即别名) Int int_value = 1024; //refValue指向int_value

JVM垃圾回收

时间秒杀一切 提交于 2020-03-07 11:16:17
一.简介 最近又复习下jvm相关内容,理解下思想,吸收下前辈经验,本文jdk 1.7/1.8 二.引用计数法与可达性分析 垃圾回收,便是将已经分配出去的的,但却不再使用的内存回收回来,以便能够再次分配。在Java虚拟机的语境下,垃圾指的是死亡对象所占据的堆空间。这里便涉及了一个关键问题:如何辨别一个对象死亡。 2.1 引用计数法 给个对象添加引用计数器,每当有一个地方引用它,计数器值就加1;当引用失效时,计数器值就减一;任何时刻计数器为0的对象就是不再被使用。 引用计数法有个重大的漏洞,无法处理循环引用的对象。 public class ReferenceCountingGC { public Object instance = null; private static final int _1MB = 1024*1024; //占内存 private byte[] bigSize = new byte[2 *_1MB]; public static void testGC(){ ReferenceCountingGC objA = new ReferenceCountingGC(); ReferenceCountingGC objB = new ReferenceCountingGC(); objA.instance = objB; objB.instance = objA;

C/C++学习笔记——C基础:指针

对着背影说爱祢 提交于 2020-03-07 11:00:59
概述 内存 内存含义: 存储器:计算机的组成中,用来存储程序和数据,辅助CPU进行运算处理的重要部分。 内存:内部存贮器,暂存程序/数据——掉电丢失 SRAM、DRAM、DDR、DDR2、DDR3。 外存:外部存储器,长时间保存程序/数据—掉电不丢ROM、ERRROM、FLASH(NAND、NOR)、硬盘、光盘。 内存是沟通CPU与硬盘的桥梁: 暂存放CPU中的运算数据 暂存与硬盘等外部存储器交换的数据 物理存储器和存储地址空间 有关内存的两个概念:物理存储器和存储地址空间。 物理存储器:实际存在的具体存储器芯片。 主板上装插的内存条 显示卡上的显示RAM芯片 各种适配卡上的RAM芯片和ROM芯片 存储地址空间:对存储器编码的范围。我们在软件上常说的内存是指这一层含义。 编码:对每个物理存储单元(一个字节)分配一个号码 寻址:可以根据分配的号码找到相应的存储单元,完成数据的读写 内存地址 将内存抽象成一个很大的一维字符数组。 编码就是对内存的每一个字节分配一个32位或64位的编号(与32位或者64位处理器相关)。 这个内存编号我们称之为内存地址。 内存中的每一个数据都会分配相应的地址: char:占一个字节分配一个地址 int: 占四个字节分配四个地址 float、struct、函数、数组等 指针和指针变量 内存区的每一个字节都有一个编号,这就是“地址”。

2019春第七周作业

試著忘記壹切 提交于 2020-03-07 09:53:12
这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 2019年春季学期第七周作业 我在这个课程的目标是 我希望能够通过学习C语言的知识,编写程序 这个作业在哪个具体方面帮助我实现目标 这个作业让我知道了掌握数组名作为函数参数的用法,理解指针和数组可以实现相同的操作 参考文献 字母大小写转换 , C 结构体 一、本周完成的作业 题目1. 6-2 每个单词的最后一个字母改成大写 (10 分) 函数fun的功能是:将p所指字符串中每个单词的最后一个字母改成大写。(这里的“单词”是指由空格隔开的字符串)。 函数接口定义: void fun( char *p ); 其中 p 是用户传入的参数。函数将 p所指字符串中每个单词的最后一个字母改成大写。 裁判测试程序样例: #include <stdio.h> void fun( char *p ); int main() { char chrstr[64]; int d ; gets(chrstr); d=strlen(chrstr) ; chrstr[d] = ' ' ; chrstr[d+1] = 0 ; fun(chrstr); printf("\nAfter changing: %s\n", chrstr); return 0; } /* 请在这里填写答案 */ 输入样例: my friend is happy 输出样例:

c/c++ 函数指针的用法

戏子无情 提交于 2020-03-07 07:02:16
【目录】 基本定义 c 函数指针使用举例 c++ 函数指针使用举例 函数指针作为函数参数 函数指针作为函数返回值 函数指针数组 typedef 简化函数指针操作 c语言函数指针的定义形式: 返回类型 (* 函数指针名称 )( 参数类型 , 参数类型 , 参数类型, …); c++函数指针的定义形式 : 返回类型 (类名称 ::* 函数成员名称)(参数类型,参数类型,参数类型, ….); 以下代码编译环境:codeblocks with gcc in win 7 c语言函数指针使用举例: #include <stdio.h> #include <stdlib.h> int fun1() { printf("this is fun1 call\n"); return 1; } void fun2(int k, char c) { printf("this is fun2 call:%d %c\n", k, c); } int main() { int (*pfun1)() = NULL; void (*pfun2)(int, char) = NULL; int a,b; pfun1 = fun1; //第一种赋值方法 a = pfun1(); //第一种调用方法(推荐) printf("%d\n",a); b = (*pfun1)();//第二种调用方法 printf("%d\n",b

Delphi 记录类型- 结构指针

醉酒当歌 提交于 2020-03-07 06:11:47
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} type TRec = record {定义结构 TRec} name: string[12]; age: Word; end; TPRec = ^TRec; {定义 TRec 结构的指针类型 TPRec} var Rec: TRec; {声明结构变量} PRec1,PRec2: TPRec; {声明 TPRec 指针变量}