指针

打印两个有序链表的公共部分

佐手、 提交于 2020-04-03 20:09:50
问题描述: 给定两个有序链表的头指针head1和head2,打印两个链表的公共部分。 算法实现: public void printCommonPart(Node head1, Node head2) { System.out.println("Common Part: "); while (head1 != null && head2 != null) { if(head1.value < head2.value) { head1 = head1.next; } else if(head1.value > head2.value) { head2 = head2.next; } else { System.out.print(head1.value + " "); head1 = head1.next; head2 = head2.next; } } System.out.println();}public class Node { public int value; public Node next; public Node(int value) { this.value = value; }} 算法解析: 1.仔细审题,得到问题的关键信息,像本题的“有序”、“头指针”等关键字; 2.对于当前题目,通过循环遍历,首先进行非空判断,其中任何一个头指针移动到null,过程即停止;

u-boot-1.1.6第2阶段入口函数start_armboot分析

妖精的绣舞 提交于 2020-04-03 17:58:10
学习目标: 1、分析u-boot-1.1.6第2阶段入口函数void start_armboot (void),熟悉该函数所实现的功能 2、为后面能够掌握u-boot-1.1.6如何启动内核过程打下基础 前面通过对uboot第一阶段代码的分析,我们了解的uboot第一阶段所做的一些工作,并且找到了其第二阶段的入口函数void start_armboot(void)。为了能够在清楚理解uboot启动内核的机制,还需要对第二阶段代码进行分析。第二阶段入口函数void start_armboot(void)存放在board.c文件中,该文件位于uboot根目录下的lib_arm文件夹中。 1.gd_t数据结构分配内存 /* Pointer is writable since we allocated a register for it */ gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); //为gd_t结构体变量开辟空间 /* compiler optimization barrier needed for GCC >= 3.4 */ //并使得gd指针指向该空间初始位置 __asm__ __volatile__("": : :"memory"); memset ((void*)gd, 0, sizeof (gd

c 指针

落爺英雄遲暮 提交于 2020-04-03 15:42:23
须要注意一点,通常所说的指针实际是“指针变量”的简称,一个指针变量可以被赋予不同的指针值;而指针则是一个地址,是一个常量 可以通过下面的方式来定义一个指向变量的指针: 类型说明符 *变量名; *表示定义的是一个指针变量,变量名即为定义的指针变量名,类型说明符表示指针变量所指向变量的数据类型。 eg: int *zhizheng; 首先理解地址运算符“&"的作用。在C语言中用 , “&”加上变量名称表示变量的地址,因此&test1表示的是变量testl的地址。在程序中,有对指针进行赋值的方式: void test2(){ char test1='A',test2='D'; char *p1=&test1; char *p2; lr_output_message("p1=%c",*p1); p2=&test1; test1 = 'U'; lr_output_message("p1=%c",*p2); *p2 = 'B'; lr_output_message("p1=%c,p2=%c,test1=%c",*p1,*p2,test1); test2 = *p2; lr_output_message("test2=%c",test2); } 结果: p1=A Action.c(29): p1=U Action.c(32): p1=B,p2=B,test1=B Action.c(36):

第十三周学习笔记

自作多情 提交于 2020-04-02 21:47:54
第十二章 并发编程 进程是程序级并发,线程是函数级并发。 三种基本的构造并发程序的方法: 进程: 每个逻辑控制流是个一个进程,由内核进行调度和维护。 I/O 多路复用: 应用程序在一个进程的上下文中显式地调度他们自己的逻辑流。 线程: 运行在单一进程上下文中的逻辑流,由内核进行调度。 12.1 基于进程的并发编程 构造并发程序最简单的方法就是 用进程。 使用大家都很熟悉的函数例如: fork exec waitpid 关于在父、子进程间共享状态信息:共享文件表,但不共享用户地址空间。 进程又独立的地址空间既是优点又是缺点: 优点:防止虚拟存储器被错误覆盖 缺点:开销高,共享状态信息才需要IPC机制 12.2 基于I/O多路复用的并发编程 就是使用select函数要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。 select函数处理类型为fd_set的集合,也叫做 描述符集合。 select函数有两个输入:一个称为 读集合 的描述符集合和该妒忌和该读集合的基数(n)(实际上是任何描述符集合的最大基数)。select函数会一直阻塞,直到读集合中至少有一个描述符准备好可以读。当且仅当一个从该描述符读取一个字节的请求不会阻塞时,描述符K就表示准备好可以读了。 作为一个副作用,select修改了参数fdset指向的fd_set,指明读集合中一个称为准备好集合的子集

java空指针异常:java.lang.NullPointException

大憨熊 提交于 2020-04-02 11:06:47
一.什么是java空指针异常 我们都知道java是没有指针的,这里说的"java指针"指的就是java的引用,我们不在这里讨论叫指针究竟合不合适,而只是针对这个异常本身进行分析。空指针就是空引用,java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常。可以理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法。对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,当然会出现空指针异常。 public class Test { private int a=1; private int b=2; public static void main(String[] args) { // TODO Auto-generated method stub Test t1 = new Test(); Test t2 = null; System.out.println(t1.a); System.out.println(t2.a); System.out.println(t2.c()); } public String c(){ return "123"; } } 我们分析上面这段示例代码,在Test类中,有两个成员变量a和b,和一个方法c()。然后在main(

深入探索C++对象模型(三)

断了今生、忘了曾经 提交于 2020-04-01 07:50:34
Data 语义学 一个class的data members,一般而言,可以表现这个class在程序执行时的某种状态。Nonstatic data members放置的是“个别的class object”感兴趣的数据,static data members则放置的是“整个class”感兴趣的数据。 C++对象模型尽量以空间优化和存取速度优化的考虑来表现nonstatic data members,并且保持和C语言struct数据配置的兼容性。它们把数据直接存放在每一个class object之中。对于继承而来的nonstatic data members(不管是virtual还是nonvirtual base class)也是如此。不过没有强制定义其间的排列顺序。 至于static data members,则被放置在程序的一个global data segment中,不会影响个别class object的大小。在程序之中,不管该class被产生出多少个objects(经由直接产生或间接派生),static data members永远只存在一份实例(甚至即使该class没有任何object实例,其static data members也已存在)。但是一个template class的static data members的行为稍有不同。 Data Member的绑定(The

2、指针的算术运算

筅森魡賤 提交于 2020-04-01 03:18:51
指针可以加上或减去一个整数。 指针的这种运算的意义和通常的数值的加减 运算的意义是不一样的 ,以单元为单位。 例如: 例二: char a[20]; int *ptr=(int *)a; // 强制类型转换并不会改变 a 的类型 ptr++; 在上例中,指针 ptr 的类型是 int*, 它指向的类型是 int ,它被初始化 为指向整型变量 a 。接下来的第 3 句中, 指针 ptr 被加了 1 ,编译器是这样 处理的:它把指针 ptr 的值加上了 sizeof(int) ,在 32 位程序中,是被加上 了 4 ,因为在 32 位程序中, int 占 4 个字节。 由于地址是用字节做单位的, 故 ptr 所指向的地址由原来的变量 a 的地址向高地址方向增加了 4 个字节。 由于 char 类型的长度是一个字节,所以,原来 ptr 是指向数组 a 的第 0 号 单元开始的四个字节,此时指向了数组 a 中从第 4 号单元开始的四个字节。 我们可以用一个指针和一个循环来遍历一个数组,看例子: 例三: int array[20]={0}; int *ptr=array; for(i=0;i<20;i++) { (*ptr)++; ptr++ ; } 这个例子将整型数组中各个单元的值加 1 。由于每次循环都将指针 ptr 加 1 个单元 ,所以每次循环都能访问数组的下一个单元。 再看例子:

C 指针精要

∥☆過路亽.° 提交于 2020-03-31 13:29:15
C 指针精要 http://blog.csdn.net/lwbeyond/article/details/6180640 一. 解读复杂指针声明 要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样. 记住原则: 从变量名处起,根据运算符优先级结合,一步一步分析. int p; /* 这是一个普通的整型变量 */ int *p; /* 首先从P 处开始,先与*结合,所以说明P 是一个指针, 然后再与int 结合,说明指针所指向的内容的类型为int 型. 所以P 是一个返回整型数据的指针 */ int p[3]; /* 首先从P 处开始,先与[]结合,说明P 是一个数组, 然后与int 结合,说明数组里的元素是整型的. 所以P 是一个由整型数据组成的数组 */ int *p[3]; /* 首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组, 然后再与*结合,说明数组里的元素是指针类型, 然后再与int 结合,说明指针所指向的内容的类型是整型的 所以P 是一个由返回整型数据的指针所组成的数组 */ int (*p)[3]; /* 首先从P 处开始,先与*结合,说明P 是一个指针 然后再与[]结合,说明指针所指向的内容是一个数组 然后再与int 结合,说明数组里的元素是整型的. 所以P

C++基本功:全面掌握const、volatile和mutable关键字

时光怂恿深爱的人放手 提交于 2020-03-31 13:18:40
C++ 程式设计过程中 ,const 的使用可以频度是非常高的 . 它在保证程式安全方面起到了不可估量的作用 . 用一句话来表达最确切不过了:"小兵立大功" . 有了 const, 那么 mutable 当然缺不了 . 然作为 const 的同胞兄弟 ,volatile 却在很多人的视野中消失 . 其实 volatile 担负的责任有何尝小呢 ? 自然 , 它们的用法多样而灵巧 , 以至新手迷惑久久 , 下面就来系统的探讨总结一下吧: 一 . 一般应用 1.const 修饰各种变量的用法 . a. 取代 define #define D_INT 100 #define D_LONG 100.29 ……… const int D_INT = 100; const D_INT = 100; // 如果定义的 int 类型 , 可省略 int. const long D_LONG = 100.29; ……… const int& a = 100; const 替代 define 虽然增加分配空间 , 可它却保证了类型安全 . 在 C 标准中 ,const 定义的数据相当于全局的 , 而 C++ 中视声明的位置而定 . b. 修饰指针相关的变量 以三组简单的定义示意: Group1: int a = 0; const int* b = &a;------------ [1] int

2019春总结作业

半世苍凉 提交于 2020-03-31 05:52:20
一、我学到的内容(整理本课程所学,用思维导图的方式,思维导图的工具可以使用:XMind) 二、我的收获(包括我完成的所有作业的链接+收获) 作业名称 链接 收获 第二周编程总结 ( https://www.cnblogs.com/da123hcy/p/10496108.html) 建立文件,并读取文件数据与存储 第三周编程总结 ( https://www.cnblogs.com/da123hcy/p/10537722.html) 二维数组的运用 第四周编程总结 ( https://www.cnblogs.com/da123hcy/p/10566586.html) 冒泡排序法与选择排序法、二分查找法的学习 第五周编程总结 ( https://www.cnblogs.com/da123hcy/p/10617911.html) 字符串与字符的区别 第六周编程总结 ( https://www.cnblogs.com/da123hcy/p/10650389.html) 知道什么是指针;指针的基本运算;指针变量的初始化 第七周编程总结 ( https://www.cnblogs.com/da123hcy/p/10685608.html) 指针、数组和地址之间的关系;数组名可以作为函数的参数;指针和数组可以实现相同的操作 第八周编程总结 ( https://www.cnblogs.com