指针

Git(二)

£可爱£侵袭症+ 提交于 2019-12-26 17:32:05
创建合并分支   在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。   一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:        每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。   当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:        你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!   不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:        假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:        所以Git合并分支也很快!就改改指针,工作区内容也不变!

图示双链表

时光毁灭记忆、已成空白 提交于 2019-12-26 16:42:12
#include <stdio.h> #include <stdlib.h> #include <string.h> struct single_link { int data; struct single_link *next; struct single_link *prev; }; int main(void) { struct single_link *head=NULL,*tail=NULL,*tmp=NULL,*i_d_tmp=NULL; int i=0,j=0; for(i=0;i<5;i++) { tmp=(struct single_link *)malloc(sizeof(struct single_link)); tmp->data=i+1; tmp->next =NULL; tmp->prev=NULL; if(head ==NULL) head = tmp; else { tail->next =tmp; tmp->prev=tail; } tail=tmp; } for(tmp=head;tmp;tmp=tmp->next) printf("init data = %d\n",tmp->data); printf("\n\n"); for(tmp=tail;tmp;tmp=tmp->prev) printf("init data = %d\n",tmp-

链表

邮差的信 提交于 2019-12-26 15:44:46
# include <stdio.h> # include <stdlib.h> typedef struct student { int num ; float score ; struct student * next ; } q ; q * creat ( int n ) ///指针类型 { int i ; q * head , * node , * end ; head = ( q * ) malloc ( sizeof ( q ) ) ; ///给head分配空间 end = head ; ///头指针=尾指针 for ( i = 0 ; i < n ; i ++ ) { node = ( q * ) malloc ( sizeof ( q ) ) ; ///给node分配空间 scanf ( "%d %f" , & node - > num , & node - > score ) ; end - > next = node ; ///连接 end = node ; ///尾部指针指向这个节点 } end - > next = NULL ; return head ; ///返回头指针地址 } void change ( q * list , int n , char a ) ///第n个节点的a值 { q * t = list ; int i = 0 ; while

软件工程第四次作业

空扰寡人 提交于 2019-12-26 15:35:23
作业说明 代码地址(main.cpp): https://dev.tencent.com/u/dtid_8e46ef0cf41e34d6/p/ruanjiangongcheng/git/tree/master 审查表 功能模块名称  实现C语言集程序的词法分析 审查人  汤飞扬 审查日期  2019-4-24 代码名称  实现C语言集程序的词法分析 代码作者 王赫 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理?  是   头文件和定义文件的目录结构是否合理?  是   版权和版本声明是否完整?  否 重要 头文件是否使用了 ifndef/define/endif 预处理块?  否   头文件中是否只存放“声明”而不存放“定义”  否      是 程序的版式 重要性 审查项 结论   空行是否得体?  是   代码行内的空格是否得体?  是   长行拆分是否得体?  否   “{” 和 “}” 是否各占一行并且对齐于同一列?  是 重要 一行代码是否只做一件事?如只定义一个变量,只写一条语句。  否 重要 If、for、while、do等语句自占一行,不论执行语句多少都要加 “{}”。  是 重要 在定义变量(或参数)时,是否将修饰符 * 和 & 紧靠变量名?注释是否清晰并且必要?  是 重要 注释是否有错误或者可能导致误解?  否 重要 类结构的public,

理清C++常量指针和指针常量这团乱麻

风流意气都作罢 提交于 2019-12-26 12:08:53
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头。其实本来没什么,这无非是 const int *p与 int* const p 的区别, 但一涉及到起名字,特别是给他们戴上“常量指针”和“指针常量”的中文帽子,由于作者和译者(针对外文书)的不同,就出现了“张冠李戴”和“李冠张戴”的乱像,不知道谁是谁了,弄得人一头雾水,尤其是对于初学者。 本文的目的就是针对这一细节,为大家将两者理清楚,同时说明在使用上的区别。 注意: 1.const int *p也可写成int const *p,即 C++中const int和int const无区别,这使得本来就很乱的局面更加麻烦,本文中我只使用const int,以后不再说明。 2. 如果您讨厌啰嗦,只想学“干货”,您可以直接跳到“ 安能辨我是雄雌——判断方法”一节(在下技术有限,就不设置页面内跳转了)。 在理清楚之前,让 我们先简单看看当前“乱象丛生”的现状吧。 一、const遇上指针——一团乱麻 同样的问题,相反的解释 1.标新立异的少数派 C++ Primer第五版的提法可谓与其它C++书籍背道而驰,它的提 常量指针——int* const p 指向常量的指针——const int *p 在英文版中,int* const p被称为const pointer,于是中文版将其译为常量指针

动态内存分配(new)和释放(delete)

北城余情 提交于 2019-12-26 11:01:30
在之前我们所写过的程序中,所必需的内存空间的大小都是在程序执行之前就已经确定了。但如果我们需要内存大小为一个变量,其数值只有在程序运行时 (runtime)才能确定,例如有些情况下我们需要根据用户输入来决定必需的内存空间,那么该怎么办呢? 答案是 动态内存分配 (dynamic memory),为此C++ 集成了操作符 new 和 delete 。 1. new 和 new [] 操作符 动态内存分配用操作符 new 。new 后面跟一个数据类型,如果要求的元素多于一个,需要加上 [], 元素数量放在 [] 中。它返回一个指向内存块开始位置的指针。语法是: pointer = new type pointer = new type [number_of_elements] 第一个表达式为数据类型为 ‘type’ 的 一个 元素分配内存地址。第二个表达式为数据类型为 ‘type’ 的 一组 元素分配一块内存,其中 number_of_elements 是整数型,表示元素的个数。例如: int* foo; foo = new int[5]; 在这个例子里,操作系统分配了可存储5个整型int元素的内存空间,返回指向这块空间开始位置的指针并将它赋给foo。因此,现在foo 指向一块可存储5个整型元素的合法的内存空间,如下图所示。 这里,foo 是一个指针,foo指向的第一个元素可以通过语句

段错误

偶尔善良 提交于 2019-12-26 10:59:55
   段错误通常是由于解除引用一个 未初始化或非法值的指针(或数组) 引起的!!!   通常导致段错误的几个直接原因:   1、解除引用一个包含非法值的指针。   2、解除引用一个空指针(常常由于从系统程序中返回空指针,未经检查就使用)。   3、在未得到正确的权限时进行访问。例如,试图往一个只读的文本段存储值就会引起段错误。   4、用完了堆栈或堆空间(虚拟内存虽然巨大但绝非无限)。   5、数组下标越界。 来源: https://www.cnblogs.com/nufangrensheng/p/3365918.html

c# leetcode 925长按键入(双指针)

六眼飞鱼酱① 提交于 2019-12-26 06:56:22
title: 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。 示例 1: 输入:name = "alex", typed = "aaleex" 输出:true 解释:'alex' 中的 'a' 和 'e' 被长按。 示例 2: 输入:name = "saeed", typed = "ssaaedd" 输出:false 解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。 示例 3: 输入:name = "leelee", typed = "lleeelee" 输出:true 示例 4: 输入:name = "laiden", typed = "laiden" 输出:true 解释:长按名字中的字符并不是必要的。 链接:https://leetcode-cn.com/problems/long-pressed-name thinking: 两个字符串的都指针++,然后判断第二个字符串的指针和第一个字符串的上一个是否相等*** code: public bool IsLongPressedName(string name, string typed) { int index

指针运算——算术运算、关系运算

拥有回忆 提交于 2019-12-26 02:35:10
是不是对指针的任何运算都是合法的呢?答案是它可以执行某些运算,但并非所有的运算都合法。除了加法运算之外,你还可以对指针执行一些其他运算,但并不是很多。 指针加上一个整数的结果是另一个指针。问题是,它指向哪里?如果你将一个字符指针加1,运算结果产生的指针指向内存中的下一个字符。float占据的内存空间不止1个字节,如果你将一个指向float的指针加1,将会发生什么?它会不会指向该float值内部的某个字节呢? 答案是否定的。当一个指针和一个整数量进行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。这个“合适的大小”就是指针所指向类型的大小,“调整”就是把整数值和“合适的大小”相乘。为了更好的说明,试想在某台机器上,float占据4个字节。在计算float型指针加3的表达式时候,这个3将根据float类型的大小(此例中为4)进行调整(相乘),这样实际上加到指针上的整型值为12。 把3与指针相加使指针的值增加3个float的大小,而不是3个字节。这个行为较之获得一个指向一个float值内部某个位置的指针更为合理。下表包含了一些加法运算的例子。调整的美感在于指针算法并不依赖于指针的类型。换句话说,如果p是个指向float的指针,那么p+1就指向下一个float,其他类型也是如此。 1.算术运算 C的指针的算术运算只局限于两种形式。第一种形式是: 指针+-整数

Java集合---LinkedList源码解析

﹥>﹥吖頭↗ 提交于 2019-12-26 02:32:36
Java集合---LinkedList源码解析 一、源码解析 1、 LinkedList类定义 2、LinkedList数据结构原理 3、私有属性 4、构造方法 5、元素添加add()及原理 6、删除数据remove() 7、数据获取get() 8、数据复制clone()与toArray() 9、遍历数据:Iterator() 二、ListItr 一、源码解析 1、 LinkedList类定义。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。 LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 LinkedList 是非同步的。