指针

c语言指针

[亡魂溺海] 提交于 2020-02-15 07:50:02
1.计算机会为变量在存储器中分配空间。 2.局部变量位于栈中。 3.全局变量位于全局变量段。 4.指针只是一个保存“存储器”地址的变量。 5.&运算符可以找到变量的地址。 6.*运算符可以读取存储器地址中的内容 7.*运算符还可以设置存储器地址中的内容 如: int x = 3; int *address = &x; *address中保存的就是x变量的存储地址 通过&提取x的地址,保存在了*address中 #include <stdio.h> int main() { int x = 3; int *address = &x; // 打印结果:一样相等 printf("%p----%p", *address, x); return 0; } 讲解: &运算符用于接收一个数据并获取地址 而 *运算符则是用于接收一个地址并保存数据 c语言中的指针在其他语言中叫法为引用类型,*就算对于地址的解析,生成具体的值 相当于其他语言中的,引用地址的具体值 C语言中声明一个指针变量: 指针变量是什么呢? 答:用来保存内存地址的变量,相当于其他语言的引入地址传给函数假参 声明指针变量: int *名称(或标识符) = &变量; 如: int x = 3; int *address = &x; &提取了变量x的地址并赋值给了address变量,*就是接收地址来表示这是一个指针变量 这时如果你去改变

js中的堆内存和栈内存

☆樱花仙子☆ 提交于 2020-02-15 07:18:23
我们常常会听说什么栈内存、堆内存,那么他们到底有什么区别呢,在js中又是如何区分他们的呢,今天我们来看一下。 一、栈内存和堆内存的区分 一般来说, 栈内存 主要用于存储各种 基本类型 的变量,包括Boolean、Number、String、Undefined、Null...以及 对象变量的指针 ,这时候栈内存给人的感觉就像一个线性排列的空间,每个小单元大小基本相等,栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。 而 堆内存 主要负责像对象Object这种变量类型的存储,堆内存存储的对象类型数据对于大小这方面,一般都是未知的,(所以这大概也是为什么null作为一个object类型的变量却存储在栈内存中的原因)。 来一张图感受一下: 二、测试 Ⅰ.基本数据类型 /* 基本数据类型 */ var a = 1; var b = 1; console.log(a === b);//true var c = '桔子桑'; var d = '桔子桑'; console.log(c === d);//true 基本数据类型,因为都是存在栈内存中的,以上面的int为例: var a = 1;变量 a 存在栈内存中,他的值是基本数据类型(int),自然也是在栈内存中,栈内存有没有1?没有那就拿出一块内存存1,这个变量a指向这块值为1的栈内存地址; var b = 1;同理,变量 b

第9课 智能指针示例

隐身守侯 提交于 2020-02-15 05:28:57
1. 内存泄漏( 臭名昭著的Bug ) (1)动态申请堆空间,用完后不归还 (2)C++语言中没有垃圾回收的机制 (3)指针 无法控制 所指堆空间的生命周期 2. 当代C++软件平台中的智能指针 (1)指针生命周期结束时 主动释放堆空间 (2)一片堆空间最多 只能由一个指针标识 (3) 杜绝指针运算和指针比较 3. 智能指针的设计的方案 (1)通过 类模板 描述指针的行为:能够定义不同类型的指针对象。 (2)重载指针特征操作符( -> 和* ):利用对象模拟原生指针的行为。 (3)智能指针的 使用军规 :只能用来指向堆空间中的 单个对象(即不能指定一个数组对象的空间)或者变量 【编程实验】智能指针 //SmartPointer.h #ifndef _SMARTPOINTER_H_ #define _SMARTPOINTER_H_ namespace DTLib{ //智能指针 template<typename T> class SmartPointer { T* m_pointer; public: SmartPointer(T* p = NULL) { m_pointer = p; } SmartPointer(const SmartPointer<T>& obj) { m_pointer = obj.m_pointer; //所有权转移,使得同一时刻只能由一个指针指向堆空间

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

Leetcode142. Linked List Cycle II

我只是一个虾纸丫 提交于 2020-02-15 01:38:19
Leetcode142. Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list. Note: Do not modify the linked list. Example 1: Input: head = [3,2,0,-4], pos = 1 Output: tail connects to node index 1 Explanation: There is a cycle in the linked list, where tail connects to the second node. Example 2: Input: head = [1,2], pos = 0 Output:

13.结构体

こ雲淡風輕ζ 提交于 2020-02-15 00:56:35
1.结构体 a.struct是关键字; b.struct Student合起来才是结构体“类型”; c.结构体内部定义的变量不能直接赋值; d.结构体只是一个类型,没有定义变量前,是没有分配空间,就不能赋值。 2.使用: (1).定义结构体变量; (2).类型名 变量名: struct Student stu; //struct关键字 //结构体变量初始化,和数组一样,要使用大括号 //在定义时才初始化 struct Student stu2 = {18,"hello",59}; (3).如果是普通变量,使用“.”运算符; (4).结构体指针变量使用:-> struct Student *p; p = &tmp; //给结构体变量一个空间 p -> age = 18;p->name = (char *)malloc((strlen("mike")+1); //给成员分配空间,如果name是结构体成员是数组,和数组操作类似 strcopy(p->name,"mike"); p->score = 59; //指针要有合法指向,才能操作结构体成员 //任何结构体变量都可以用“.”或“->” (&temp)->age = 18; (*p).age = 18; //合法 3.结构体变量定义: 4.迭名结构体 5.结构体数组 6.结构体嵌套 struct Info { int age;

C@指针&数组

拟墨画扇 提交于 2020-02-15 00:54:03
一、指针数组和数组指针 1、字面意思理解指针数组和数组指针 指针数组的实质就是一个数组,这个数组中存储的内容全部是指针变量 数组指针的实质是一个指针,这个指针指向的是一个数组。 2、分析指针数组和数组指针的表达式 (1)int*p[5]; int(*p)[5]; int *(p[5]); (2)一般规律 :int *p;(p是一个指针) int p[5] ;(p是一个数组) 总结:我们定义一个符号时,关键在于首先找到定义的符号是谁(第一步找核心) 其次再来看谁跟核心最近,谁跟核心结合(第二部:找结合) 以后继续向外扩展(第三步:继续向外结合直到符号完) (3)核心结合 - 如何核心和 “ * ”结合,表示核心是指针, - 如果核心和“[ ]”结合表示核心是数组, - 如果核心和小括号“()”结合,表示核心是函数 (4)一般规律来分析3个符号 例子1: int *p[5]; (“[ ]”的优先级比“ * ”优先级高) p是一个数组,数组有5个元素,数组中的元素都是指针,指针指向的元素类型是int类型,整个符号是一个指针数组。 例子2: int (*p)[5]; 核心是p,p是一个指针,因为p被用括号和星好强制结合起来了。指针指向一个数组,数组有5个元素,数组中存在的元素是int类型; 例子3: int *(p[5]); 这里 加小括号没有意义,没起到左右,没有小括号,也是p与[

利用函数指针数组写计算器

拟墨画扇 提交于 2020-02-15 00:32:07
数组是存放相同数据类型元素的存储空间,指针是存放数据元素的地址的。 那我们要把很多函数的地址放入一个数组,该如何定义呢? int ( * p [ 10 ] ) ( int x , int y ) = { 0 } ; p先和[]结合是数组,数组的内容是int (*)()的函数指针。 具体应用: 先展示普通计算器: # include <stdio.h> # include <math.h> void menu ( ) { printf ( "******************************************\n" ) ; printf ( "**** 1.加法 2.减法 3.乘法 4.除法 ****\n" ) ; printf ( "**** 5.平方 6.立方 7.开方 0.退出 ****\n" ) ; printf ( "******************************************\n\n" ) ; } float JiaFa ( float x , float y ) { return x + y ; } float JianFa ( float x , float y ) { return x - y ; } float ChengFa ( float x , float y ) { return x * y ; } float

北京大学肖臻老师《区块链技术与应用》公开课笔记3

拈花ヽ惹草 提交于 2020-02-14 19:06:38
北京大学肖臻老师《区块链技术与应用》公开课笔记 比特币数据结构篇,对应肖老师视频:https://www.bilibili.com/video/av37065233?p=3 全系列笔记请见:https://blog.csdn.net/Mu_Xiaoye/article/details/104299664 Hash pointer(哈希指针) 指针 在程序运行过程中,需要用到数据。最简单的是直接获取数据,但当数据本身较大,需要占用较大空间时,明显会造成一定麻烦。因此,可以引入 指针 这一概念。当需要获取数据时,只需要按照指针所给的地址,去对应的位置读取数据即可,这样大大节省了内存空间。 在实际中,为了便于程序移植性等原因,指针实际上存储的是 逻辑地址 而非物理地址。 区块链结构本身为一条链表,节点为区块。而传统链表实现,便是通过指针将各个节点串联起来而称为最终的链。如下便是我们最常见的一个链表: 但在区块链系统中,并未采用指针,而是使用了 哈希指针 哈希指针 如下图对于该节点,我们可以看到有两个指针指向这个节点(实际上为一个),其中P为该节点的地址,H()为该节点的哈希值,该值与节点中内容有关。当节点(区块)中内容发生改变,该哈希值也会发生改变,从而保证了区块内容不能被篡改。 在比特币中,其最基本的数据结构便是一个个区块形成的区块链。 区块链与链表区别1:哈希指针代替普通指针