指针

小沈的C++学习7——指针

[亡魂溺海] 提交于 2020-03-25 15:00:59
  这节课终于学到指针了,话说感觉我是不是在前面几篇博客已经用过不少次这玩意了。但是指针到底是个什么东西呢?今天就让我们来学习指针这个东西。   首先我们小学一年级就学过,电脑里面有内存这个东西,就是利用电位高低存储各种数据,然后可以让cpu各种调用的小容器,而各种数据就听从程序的指挥,在一个个小格子里落户,这个格子就是内存地址。这个时候如果一个函数内部运行的时候在内存上留下了一串数据,它想把这一串数据都交给主函数,那它就可以直接把某个小格子的位置告诉主程序,主程序就可以利用这个位置信息直接到内存里去找这个函数留下来的数据。而这个位置信息就是指针。   首先我们要知道,指针本身也是一种数据,意思就是我们拿到一个指针,到指针指的位置上拿到一个数据,可能也是一个指针。   有了指针,我们甚至可以自己创造一个数据类型。比如我们所有函数都遵循这样一个约定:返回一个指针,指针指向一个指针数组,指针数组的一个指针指向一个数字,代表这个数据的长度或者内存长度,第二个指针指向另一个数字数组,代表这个数据里面每个数据的数据类型,第三个及之后的指针则指向各个数据。这个数据类型是不是很熟悉?没错,只要我们愿意,我们也可以手作一个列表。并且由于指针可以指向指针,这个列表可以不断嵌套(禁止禁止套娃)。 一、指针定义和运算 首先既然我们有了地址,那我们也要知道地址的数据有多长,是个什么类型的数据

Git Pro - (2)分支

*爱你&永不变心* 提交于 2020-03-25 08:45:06
Git 保存的不是文件差异或者变化量,而只是一系列文件快照。 在 Git中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附属信息,以及一定数量(也可能没有)指向该提交对象直接祖先的指针。当使用 git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。提交多次后的的Git对象数据可能如下: Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动: 分支基本操作 创建分支 git branch testing 这会在当前 commit 对象上新建一个分支指针: 那么,Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针,指向当前所在分支: 切换分支 git checkout testing 运行 git branch 命令,仅仅是建立了一个新的分支

作业10总结

孤人 提交于 2020-03-25 08:43:54
一、知识点:   1.指针表量的概念:     变量可以用来存放数值(如整数、实数等),也可以用来存放地址(另一个变量的地址),这种专门用于储存指针(地址)的变量就称为指针变量。   2.指针变量的定义:     在定义指针变量时,需要用指针声明符“*”表示此变量并非一般变量,而是用来存放其他变量地址的指针变量。由于每一个变量都属于一个特定类型 ,因此在定义指针变量时,需要声明该变量的类型,以便能够通过指针正确访问特定类型的数据。     定义一个指针的语法格式为:       基类型标识符 *指针变量名;   (1)“基类型”就是指针所指数据的类型。   (2)定义指针变量的时,在指针变量名前加符号“*”。“*”称为指针声明符,用于说明其后的名字是一个指针变量名。   3.指针变量名的初始化和赋值:     和其他变量一样,指针变量也可以进行初始化。可以用变量的地址对指针变量进行初始化,但必须注意:该变量的类型必须和指针变量的基类型相同。也可以用一个指针变量的值给另一个指针变量赋值,但它们应该具有相同的基类型。   4.引用指针变量:     当一个指针变量被初始化或被赋值之后,它就指向一个特定的变量。这时,就可以使用指针访问它所指向的内存空间。使用指针访问它所指向的内存空间的方法是在指针变量名前加一个“*”号。此处的“*”号是“指针运算符”。又称为“间接访问运算符”,它作用于

C++的那些事:你真的了解引用吗

柔情痞子 提交于 2020-03-25 07:42:34
一、引用的本质是什么 说到引用,一般C++的教材中都是这么定义的: 1,引用就是一个对象的别名。 2,引用不是值不占内存空间。 3,引用必须在定义时赋值,将变量与引用绑定。 那你有没有想过,上面的定义正确吗?编译器是如何解释引用的? 这里先给出引用的本质定义,后面我们再进一步论证。 1,引用实际是通过指针实现的。 2,引用是一个常量指针。 3,引用在内存中占4个字节。 4,在对引用定义时,需要对这个常量指针初始化。 二、探究本质 我们从最简单的变量的定义开始,看编译器会做哪些事情。 int var = 42; mov dword ptr [var],2Ah // 对应汇编代码 上面语句申请了一块内存空间,占4个字节,存放了一个int型的变量。内存里放的是42的二进制码。 汇编代码向我们表达的意思就是把42写入以var为地址的内容区域。var有点像我们理解上的指针,只是编译器并没有把它抽象出来,而是让我们更表象的理解:申请一个变量,它的值为42。 那么 var这个变量名放在哪呢 ? 我们知道程序如果访问内存里的数据,需要通过地址来进行访问,所以上面的代码在经过编译器生成目标代码时,用存放42的地址了所有的var,所以结论时, 目标文件中不存在var,所以变量名本身是不占内存的 。 而我们知道,引用是变量的一个别名。那么,从这很多人会联想到,引用会不会也只是一个名字而已

cpp智能指针

徘徊边缘 提交于 2020-03-24 14:55:13
weak_ptr<Cls1> wp1; { shared_ptr<Cls1> ptr1(new Cls1);//共享指针 wp1 = ptr1;//临时共享指针 std::cout << wp1.use_count()<<"\n";//1 auto wptr2 = wp1.lock(); std::cout << wp1.use_count() << "\n";//2 } std::cout << wp.use_count() << "\n";//0 脱离域 智能指针释放 在UE4里相对应的是 TSharedPtr,TWeakPtr,TSharedRef 工程里的内存泄露从内存分配管理开始。 指针详 http://blog.csdn.net/sndaxdrs/article/details/6175701 内存管理 http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html 来源: https://www.cnblogs.com/mattins/p/8556120.html

指针以前

心不动则不痛 提交于 2020-03-24 12:30:14
#include<stdio.h> #include<float.h> //int x=7; //int s=3; //int add() //{ // /*extern int x; // extern int y;*/ // int x = 1; // int y = 2; // return x+y; //} //int max(int x, int y) { // if (x >= y) // return x; // else // return y; //} int* sz(int a[],int size) { int i; for (i = 0; i < size / sizeof(a[0]); i++) { a[i] = 100 + i; } return a; } int main() { int i; int argv[10]; sz(argv,sizeof(argv)); for (i = 0; i < sizeof(argv) / sizeof(argv[0]); i++) { printf("%d\n", argv[i]); } /*printf("float存储最大字节数:%zX\n", sizeof(float)); printf("float最大值:%E\n", FLT_MAX); printf("float最小值:%E\n", FLT_MIN);

TiKV Rust Client 迁移记

一曲冷凌霜 提交于 2020-03-24 08:43:10
3 月,跳不动了?>>> 作者介绍:Nick Cameron,PingCAP 研发工程师,Rust core team 成员,专注于分布式系统、数据库领域和 Rust 语言的进展。 最近我将一个中小型的 crate 从 futures 库的 0.1 迁移至了 0.3 版本。过程本身不是特别麻烦,但还是有些地方或是微妙棘手,或是没有很好的文档说明。这篇文章里,我会把迁移经验总结分享给大家。 我所迁移的 crate 是 TiKV 的 Rust Client 。该 crate 的规模约为 5500 行左右代码,通过 gRPC 与 TiKV 交互,采用异步接口实现。因此,对于 futures 库的使用颇为重度。 异步编程是 Rust 语言中影响广泛的一块领域,已有几年发展时间,其核心部分就是 futures 库。作为一个标准 Rust 库,futures 库为使用 futures 编程提供所需数据类型以及功能。虽然它是异步编程的关键,但并非你所需要的一切 - 你仍然需要可以推进事件循环 (event loop) 以及与操作系统交互的其他库。 futures 库在这几年中变化很大。最新的版本为 0.3(crates.io 发布的 futures 预览版)。然而,有许多早期代码是 futures 0.1 系列版本,且一直没有更新。这样的分裂事出有因 - 0.1 和 0.3 版本之间变化太大。0

环形链表

旧城冷巷雨未停 提交于 2020-03-23 21:46:44
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:tail connects to node index 0 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:no cycle 解释:链表中没有环。 解题思路: 构建双指针第一次相遇: 设两指针 fast,slow 指向链表头部 head,fast 每轮走 2 步,slow 每轮走 1 步; 若 fast 指针走过链表末端,说明链表无环,直接返回 null(因为每走 1轮,fast 与 slow 的间距 +1,若有环,快慢两指针终会相遇); 当 fast == slow 时,代表两指针在环中 第一次相遇,此时执行 break 跳出迭代; 第一次相遇时步数分析: 设链 表头部到环需要走 a 步 , 链表环走一圈需要 b

2020 重学C++ 重构你的C++知识体系

不羁岁月 提交于 2020-03-23 19:01:53
2020 重学C++重构你的C++知识体系 百度10年C++开发工程师的经验心得,带你深入底层、深入细节、深入思想,重学C++ 从学习角度看,C++是一门“见效慢”的语言;学习曲线陡峭,语言本身复杂。但,如果你想了解很多编程语言的思想源泉,想要一窥大型企业级开发工程的思路,想开发别人做不了的高性能程序,那C++就是你的不二之选。如果你想成为一名资深开发人员,想一窥底层细节,那么,这门课就是为你设计的。课程将从C++的发展史讲起,从知识与思想层面 从0带你构建C++知识框架,并会分享讲师亲历的大型项目实践思路,为你打下坚实的基础 第1章 C++概括 了解C++的历史概况,C++语言的特点及C++语言作用,认识哪些场合下C++是无可替代的; 第2章 C++基础语法 本章讲解编程语言的层次,编译语言的特点;深入学习C++常见的标识符,关键字,数据类型,变量,常量及;IDE Visual Studio的安装,使用和调试方法; 第3章 C++的运算符与表达式 理论结合实际,深入讲解C++表达式,表达式;分别讲解了算术运算符,关系运算符,逻辑运算符,位运算符,赋值运算符及杂项运算符及表达式,同时讲解了注释的用处和规范; 第4章 C++基础容器 本章我们将深入剖析C++数组:传统的数组优缺点及STL中vector的使用和思想;剖析C++的字符串: 对比C的字符串,C++的字符串

B树、B-树、B+树、B*树

风流意气都作罢 提交于 2020-03-23 15:21:41
B树 即 二叉搜索树 : 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; (平衡二叉搜索树的优势) 如果 B 树的所有非叶子结点的左右子树的结点数目均保持差不多( 平衡 ),那么 B 树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是 常数开销 ; 如: 但B树在经过多次插入与删除后,有可能导致不同的结构: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的策略; B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2