指针

Berry 实现:自动扩充的调用栈

末鹿安然 提交于 2020-01-24 23:09:55
概述 调用栈用于存储函数执行过程中调用链上所有函数的局部变量等调用信息。Berry 调用栈特指脚本程序的调用栈,而不是 C 的调用栈。 在 be_vm.h 中可以看到 VM 结构中和调用栈相关的字段: struct bvm { // ... bvalue *stack; /* stack space */ bvalue *stacktop; /* stack top register */ bstack callstack; /* function call stack */ // ... }; stack 和 stacktop 用于维护存储局部变量的栈(以下简称“变量栈”,函数的栈空间指 vm.stack 中被该函数使用的一段空间),而 callstack 为函数栈帧的堆栈。 我们用一个简单的脚本来说明上述字段的作用: def func1(c) return c + 1 end def func2(b) return func1(b) + 2 end def func3(a) return func2(a) + 3 end 当我们执行 func3(10) 的时候,执行到 func1 内部时调用链最长: call stack top +-------------------------+ | function: func1 | | local variable(s): c | +-

coursera学习——指针

廉价感情. 提交于 2020-01-24 22:40:47
一、一位数组与指针 1.变量三要素:地址(指向这个变量的指针)、值、名字。 2. &:取变量的地址 int a = 0 ; cout << & a ; //打印a变量起始地址(a的地址为4B,即地址长度、指针为4B) 3.*:取指针(地址)的值 cout << * & c ; //取地址为&c的变量的值(*&c=c) 4.指针变量:存放指针(地址)的变量 int * pointer = NULL ; //赋初值 //指针变量的定义,pointer指向的c为int型,因此*pointer为int型 pointer = & c ; //pointer指向c(或者直接定义 int *p=&c) pointer变量值为c变量的地址 //*pointer=c 5.运算:高(只低于a+±-) int * p = NULL ; ( * p ) ++ ≠ * p ++ ( 原来指向 0x0012FF71 , ++ 后指向 0x0012FF75 , int 为加 4 , char 为加 1 ) 6.数组 int a [ 5 ] = { 0 } ; //数组名=指向数组第一个元素的指针 int * p = & a [ 0 ] ; //a++无意义 p++有变化,p可以指向数组元素外的元素 二、字符串与指针 1.定义 char a [ 10 ] ; char * p ; p = a ; /

托管对象本质-第一部分-布局

☆樱花仙子☆ 提交于 2020-01-24 20:02:15
目录 托管对象本质-第一部分-布局 目录 IsMarked 标记 相关文献 托管对象本质-第一部分-布局 原文地址: https://devblogs.microsoft.com/premier-developer/managed-object-internals-part-1-layout/ 原文作者:Sergey 译文作者:杰哥很忙 目录 托管对象本质1-布局 托管对象本质2-对象头布局和锁成本 托管对象本质3-托管数组结构 托管对象本质4-字段布局 托管对象的布局非常简单:托管对象包含实例数据、指向元数据的指针(也称为方法表指针)和内部信息包(也称为对象头)。 译者补充: 方法表指针在某些文章也被称之为类型句柄,英文是TypeHandle。 当我第一次看到对象的布局时,我产生了一些疑问: 为什么对象的布局如此怪异? 为什么托管引用指向对象的中间,而对象头的偏移量为负? 对象头中存储了哪些信息? 译者补充:作者对于布局怪异实际指的就是对象头的偏移量为负数。由于托管对象以引用地址的偏移量记为0,对象头大小为4或8字节(取决于是32位还是64位,实际64位对象头也仅使用4字节,前面4个字节填充0)。因此由于对象头在对象指针之前,因此它的偏移量位-4或-8。 当我开始思考布局并做了一个快速研究时,我只有几个选择: JVM 从一开始就对托管对象使用了类似的布局。 今天听起来有点疯狂

线性表、栈与队列

巧了我就是萌 提交于 2020-01-24 18:57:46
《大话数据结构》 线性表 基础知识 线性表:零个或多个数据元素的有限序列。关键词:序列,有限。 元素个数定义为线性表的长度,n=0时成为空表。 在较复杂的线性表中,一个数据元素可以由若干个数据项组成。 线性表的一些基本操作:初始化建立空的线性表,判断是否为空,清空,取出第i个值,查找与给定值相同的值的位置,加入新元素,删除第i个元素,返回元素个数。 对于复杂的操作,就是将基本操作组合起来。 存储 顺序存储 用一段地址连续的存储单元依次存储线性表的数据元素。 可以用C预言的一维数组来实现顺序存储结构。 顺序存储的三个属性:起始位置,最大存储容量,当前长度。 地址计算方法,随机存取结构 顺序存储中的操作: (1)读取,直接取出第i个值即可 (2)插入,插入位置不合理或者本身的长度已经大于等于数组长度则抛出异常,其余情况,向后移动一部分数据将新数据插入第i个位置。 删除元素:如果删除位置不合理,抛出异常;取出删除元素,从删除位置开始遍历到最后一个位置,分别将它们都向前移动一个位置。表长减一。 对于顺序存储结构,存读数据时,时间复杂度都是O(1),而插入和删除时,时间复杂度是O(n)(是平均复杂度(n-1)/2化简得到)。 顺序存储的优点:无需为表示表中元素之间的逻辑关系而增加额外的存储空间,可以快速的存取表中任意位置的元素。 缺点:插入和删除操作需要移动大量元素,当线性表长度变化较大时

数据结构------线性表

时光毁灭记忆、已成空白 提交于 2020-01-24 18:56:31
知识框架: --- 顺序存储(逻辑相邻物理相邻)-----------------------------顺序表 - - ---单链表(指针实现) 线性表(逻辑结构) - ----双链表(指针实现) -链式存储(逻辑相邻的但物理不)-----------------------------循环链表(指针实现) ----静态链表(数组实现) 1、线性表的特点: 1 表中元素个数有限 2 元素有先后测序性 逻辑相邻 3 元素类型相同 每个元素占大小相同的存储空间 4 线性表是逻辑结构 顺序表和链表都是存储结构 线性表逻辑相邻 顺序表物理相邻 链表 物理不一定相邻,线性表中每个元素除开始元素外只有一个前驱 2、链表注意要点: 1 头指针和头结点的区分 : 不管带不带头结点,头指针始终指向链表的第一个结点,如果带头结点,则头指针指向它,通常头结点不存储信息。 头指针的意义在于,在访问链表时,总要知道链表存储在什么位置(从何处开始访问),由于链表的特性(next指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的 2 单链表添加头节点的好处 :(如果带头结点的单链表 head.next()为空则链表空) a 、 对链表头的操作 和 其他位置的操作一致,不必分情况处理,头结点和其他内部结点处理统一 b、 无论链表是否为空,其头指针是指向头结点的非空指针

指针的步长

 ̄綄美尐妖づ 提交于 2020-01-24 16:28:44
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stddef.h> //offsetof头文件 //指针的步长 //1、指针变量+1后跳跃的字节数 void test01() { char* p = NULL; //int a = 1000; //p = &a; printf("%d\n", p); printf("%d\n", p+1); } //2、在解引用的时候,取出的字节数 void test02() { char buf[1024] = { 0 }; int a = 10005; memcpy(buf+1, &a, sizeof(a)); char* p = buf; printf("%d\n", *(int *)(p+1)); } //指针步长练习 struct Person { char a; int b; char buf[1024]; int d; }; void test03() { struct Person p = { 'a',10,"hello world",1000 }; //获取结构体p中的d属性偏移量是多少? printf("d的偏移量为:%d\n", offsetof(struct Person,

AC自动机模板

霸气de小男生 提交于 2020-01-24 14:44:27
AC自动机原理: 摘自 http://www.cnblogs.com/huangxincheng/archive/2012/12/02/2798317.html ,ORZ大牛 一:构建AC自动机 同样我也用网上的经典例子,现有say she shr he her 这样5个模式串,主串为yasherhs,我要做的就是哪些模式串在主串中出现过? 1: 构建trie树 如果看过我前面的文章,构建trie树还是很容易的。 2:失败指针 构建失败指针是AC自动机的核心所在,玩转了它也就玩转了AC自动机,失败指针非常类似于KMP中的next数组,也就是说, 当我的主串在trie树中进行匹配的时候,如果当前节点不能再继续进行匹配,那么我们就会走到当前节点的failNode节点继续进行 匹配,构建failnode节点也是很流程化的。 ①:root节点的子节点的failnode都是指向root。 ②:当走到在“she”中的”h“节点时,我们给它的failnode设置什么呢?此时就要走该节点(h)的父节点(s)的失败指针,一直回溯直 到找到某个节点的孩子节点也是当初节点同样的字符(h),没有找到的话,其失败指针就指向root。 比如:h节点的父节点为s,s的failnode节点为root,走到root后继续寻找子节点为h的节点,恰好我们找到了,( 假如还是没 有找到,则继续走该节点的failnode

指针实验报告

南楼画角 提交于 2020-01-24 10:56:13
指针实验报告 一、 题目分析 题目一 6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数。 函数接口定义: void sum_diff( float op1, float op2, float *psum, float *pdiff ); 其中 op1 和 op2 是输入的两个实数, *psum 和 *pdiff 是计算得出的和与差。 裁判测试程序样例: #include <stdio.h> void sum_diff( float op1, float op2, float *psum, float *pdiff ); int main() { float a, b, sum, diff; scanf("%f %f", &a, &b); sum_diff(a, b, &sum, &diff); printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff); return 0; } /* 你的代码将被嵌在这里 */ 本题 PTA 提交列表 程序设计思路(流程图) 子函数即进行两个数的相加减 ……思路简单,所以流程图略…… 最终程序如下: void sum_diff( float op1, float op2, float *psum, float *pdiff ) { *psum=op1+op2

第六周编程总结

醉酒当歌 提交于 2020-01-24 09:56:45
函数fun的功能是:求两数平方根之和,作为函数值返回。例如:输入12和20,输出结果是:y = 7.936238。 函数接口定义: double fun (double a, double b); 其中 a和 b是用户传入的参数。函数求 a指针和b 指针所指的两个数的平方根之和,并返回和。 裁判测试程序样例: include<stdio.h> include <math.h> double fun (double a, double b); int main ( ) { double a, b, y; scanf ("%lf%lf", &a, &b ); y=fun(&a, &b); printf ("y=%.2f\n", y ); return 0; } /* 请在这里填写答案 */ 输入样例: 12 20 输出样例: y=7.94 1.实验代码 double fun(double a,double b) { double c,d,result; c=sqrt( a); d=sqrt( b); result=c+d; return result; } 2.设计思路 3.运行结果 读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。 输入格式: 输入有两行: 第一行是n值; 第二行是n个数。 输出格式: 输出最大值和最小值。 输入样例: 在这里给出一组输入。例如:

Leetcode 142题 环形链表 II(Linked List Cycle II) Java语言求解

我与影子孤独终老i 提交于 2020-01-24 09:02:40
题目描述: 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 分析 给出示意图: 对符号的一些说明: 公式演算: 很容易得到: m=x+y(环的长度两种表示形式); 快指针走两步,慢指针走一步。所以快指针的速度是慢指针的速度的二倍,所以相同时间内,快指针走的长度也是慢指针走的长度的二倍: 有: f=2s; 在快指针走过 圈后两指针相遇,有: m+kn+y=2(m+y); 去括号后有: m+kn=2m+y; 解得: m=kn-y; 又因为:n=x+y; 所以有:m=kn-(n-x); 所以:m=x+n(k-1)。 m是头节点到环起点的长度; x是相遇点到头节点的长度; x-m是(k-1)个环的长度。 通过公式的演算,我们能够明白: 找到相遇点后,链表头节点与相遇点节点同时出发,相遇处便是环的起点。相遇点节点多走了(k-1)个环。 /** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next =