指针

关于链表中指针的学习

女生的网名这么多〃 提交于 2020-02-10 19:28:46
  昨天晚上在学习数据结构关于链表的部分,理解链表没什么难度,但是当自己动手写程序的时候各种问题就出来了,感觉逻辑很正常但是总得不到正确的结果。 首先自己对C语言指针理解的不是很深入,在定义链表节点的结构体时,定义了一个指针类型的变量指向结构体如代码所示:    1 typedef int status; 2   typedef struct Node{ 3    status data; 4    Node *next; 5   }Node,*linklist;   然后在main函数中定义一个指向结构体的指针变量如 linklist L;   在main函数之外声明一个创建链表的函数    1 void Create_list(linklist L1,int n){ 2    linklist p; 3    L1 = (linklist)malloc(sizeof(Node)); 4    L1->next = NULL; 5    for(i = 0;i < n; i++){ 6    p = (linklist)malloc(sizeof(Node)); 7    p->data = i; 8    p->next = L1->next; 9    L1->next= p; 10   } 11   } Create_list函数采用的事头插法添加链表节点,经过main

嵌入式常见面试题目

て烟熏妆下的殇ゞ 提交于 2020-02-10 18:53:28
嵌入式常见面试题目 Heap(堆)和stack(栈)的区别 全局变量与局部变量的区别 结构体和联合体的区别 数组与指针的区别 指针函数与函数指针的区别 常量与变量的区别 指针自增自减与变量自增自减有什么区别 #error的作用是什么 #include Heap(堆)和stack(栈)的区别 堆上的空间是手动分配与释放的,栈上的空间是自动分配与释放的。堆的空间是有限的,堆的空间是最大的自由储存区。 全局变量与局部变量的区别 作用域不同:全局变量的作用域为整个程序,局部变量的作用域为当前语句块; 内存储存方式:全局变量存储在全局数据区,局部变量存储在栈上; 生命周期不同:全局变量的生命周期和程序一样,局部变量随着语句块的结束而结束; 当局部变量与全局变量同名时,优先使用局部变量,使用全局变量是要用域成员运算符 结构体和联合体的区别 结构体和联合体都是由不同的数据类型组成,但在任何时刻,联合体只存在一个被选中的成员,结构体所有成员都存在。 在结构体中,各成员占有自己的储存空间,总大小等于各成员的大小之和 在联合体中,所有成员公用一块储存空间,其大小等于联合体中最大成员的大小 数组与指针的区别 数组要么在静态存储区,要么在栈上被创建。数组名对应着一块内存,其容量与地址在生命周期内保持不变。 指针可以随时指向任意类型的内存块,他的特征是可变。比数组灵活,但也危险。 指针函数与函数指针的区别

CodeForces912E 折半+二分+双指针

拟墨画扇 提交于 2020-02-10 18:52:31
http://codeforces.com/problemset/problem/912/E 题意·n个质数,问因子中只包含这其中几个质数的第k大的数是多少 最显然的想法是暴力搜预处理出所有的小于1e18的值,排序后直接输出,但是n的范围是16,仔细一想发现事实并不可行,不论是时间还是空间都不允许。 本题的难点在于考虑到用折半将其分成两个集合,预处理出每个集合内所有可能的数,由于一个集合最多只有8个,这是一个允许爆搜的范围,与处理完了之后二分出答案即可,check函数里需要用到双指针的技巧来查找给定数字在两个集合乘积中的位置, #include <map> #include <set> #include <ctime> #include <cmath> #include <queue> #include <stack> #include <vector> #include <string> #include <cstdio> #include <cstdlib> #include <cstring> #include <sstream> #include <iostream> #include <algorithm> #include <functional> using namespace std; #define For(i, x, y) for(int i=x;i<=y;i+

C++中的const

自闭症网瘾萝莉.ら 提交于 2020-02-10 18:31:47
1.修饰变量 const int i = 0; // i 为常量,不可修改 const int* p = &i; // 指向常量的指针 int const *p = &i; // 指针为常量,指向i不可修改 const int &r = i; // 常量引用,不可通过r修改i typedef int *po; const po p = &i; // 此时const修饰的是 int* ,所以此时指针是常量 顶层const:指针本身是常量 底层const:指针所指向的对象是常量 2.修饰函数(包括返回值,参数,函数体) const int fun(){...} // 函数返回值为常量 void fun(const int a, const int b){...} //函数参数为常量 const如何修饰函数体(主要修饰类的成员函数): class TestClass { public: TestClass() : val(100) {} ~TestClass() {} int getVal_v1() { return val; } int getVal_v2() const {     // val ++; 编译报错,常量成员函数不可修改数据成员 return val; } private: int val; }; int main() { TestClass t; int a = t

以太坊之三状态树

喜欢而已 提交于 2020-02-10 17:49:06
正在学习区块链,如果我哪里有错误希望大家指出,如果有任何想法也欢迎留言。这些笔记本身是在typora上写的,如果有显示不正确的敬请谅解。笔记本身也是给我自己写的,所以如果有侵权的请通知我,我立即删除。 3. 状态树 这个数据结构的目的很明显,为了保存每种账户的当前状态,这就和银行的账户很像了,比比特币的UTXO友好很多。 patricia trie 字典树有一点浪费空间,比如下面这个例子。 但是路径patricia trie进行路径压缩后。 因此, 当键值分布比较稀疏的时候路径压缩效果比较好 ,不是说那些公共的前缀多就好,而是说地址之间没有什么共同点,随机性很大。这正好符合以太坊的特点。其实不光是以太坊,比特币也是这样的,为了保证地址之间没有冲突,地址长度大是唯一的办法,而地址一长自然就稀疏了。 merkel patricia trie 这个的改变非常明显,就是用哈希指针代替普通指针。普通指针内存放的是数据的地址,哈希指针内存的是哈希值,具体的地址要由哈希值再次查询。 modify merkel patricia trie 实际中使用的MPT树是修改过的,具体的修改内容看下图 ![avatar][pic3-3] 一共有四个账户,就是右上角a7开头的那四个账户,其中第一个有45.0以太币,第二个有1.00WEI,以此类推。整棵树分为extension nod、branch

01 程序的编译执行、变量、static和const关键字、循环的转换、指针与数组

孤人 提交于 2020-02-10 16:41:35
初学者的探索之路01 1.代码编译的几个阶段 2.程序的执行 1>程序和进程的区别: 2>内存的四个区域 3.变量的分类以及特性 4.static关键字的影响 5.const的用处(L) 6.for循环和while循环以及do-while循环之间的转换关系(L) 7.指针的分类以及特性 8.数组与指针的结合(L) 9.代码的合法性和完整性(时间与空间的平衡)(L) 附:rand()函数和srand()函数的用法 1.代码编译的几个阶段 .c .cpp 源文件 .i 预处理文件 .o(linux操作系统下) .obj(windows操作系统下) 目标文件 .exe 可执行文件 分为三个阶段:预编译、编译、链接过程 所有的#都是在预编译过程中展开的 2.程序的执行 1>程序和进程的区别: 程序执行后会进入进程。 程序是静态的,进程是动态的。 程序在运行的时候会耗损时间(cpu)和空间资源(内存)。 2>内存的四个区域 .code 代码段 .data 数据区 .heap 堆区 .stack 栈区 两个凡是 :1.凡是在函数外部定义的变量叫做全局变量 ,存储在数据区。 2.凡是在函数内部定义的变量叫做局部变量,存储在栈区。 3.变量的分类以及特性 变量可以分为 :全局变量、在函数内定义的局部变量、在块内定义的局部变量。 变量的两个特性 :可见性和生存期 可见性 :针对编译链接过程来谈论的

【洛谷P6072 [MdOI2020] Path】【回滚莫队+Trie】

老子叫甜甜 提交于 2020-02-10 13:05:21
题意 给一棵 n n n 个节点的树,边有边权。定义一条路径的权值为边权的异或和。找两条节点不相交的路径,使得这两条路径的权值和最大。 n ≤ 30000 n\le 30000 n ≤ 3 0 0 0 0 分析 问题可以转化成对于每个点,求在该点的子树内和子树外分别找两个数,使得它们的异或的和尽可能大。 求出dfs序并倍增,就可以转化成在区间中选两个数,使得这两个数的异或和尽可能大。 用回滚莫队+Trie就好了。 回滚莫队具体来讲,就是左右端点都在同一个块内的询问直接暴力搞。把其他询问以左端点所在的块为第一关键字,右端点为第二关键字排序。在处理某个块内的询问的时候,记录 a n s ans a n s 表示该块的右端点到右指针的答案。每次把右指针推到询问的右端点,再把左指针从块的右端点推到询问的左端点,之后把左指针恢复就好了。 时间复杂度 O ( n n log ⁡ V ) O(n\sqrt n\log V) O ( n n ​ lo g V ) . 代码 # include <bits/stdc++.h> # define pb push_back const int N = 30005 ; int n , cnt , last [ N ] , bel [ N ] , tim , dfn [ N ] , val [ N ] , w [ N * 2 ] , mx [ N ] ,

About 指针

给你一囗甜甜゛ 提交于 2020-02-10 13:03:20
一. 地址指向该变量单元,地址形象化地称为“指针”. 如果有一个变量专门用来存放另一个变量的地址(即指针),则它称为“指针变量”。 指针变量就是地址变量,用来存放地址,指针变量的值是地址(即指针)。 二. 定义指针变量定义 类型名 *指针变量名 如: int *pointer-1; 左端的int是定义指针变量时 必须指定的“基类型” ,指针变量的基类型用来指定 此指针变量可以指向的变量的类型。 (基本的数据类型如:int,char,float等) pointer-1是指所存的地址 *pointer-1指向存储的地址指的数据 来源: CSDN 作者: weixin_45732699 链接: https://blog.csdn.net/weixin_45732699/article/details/104245730

C++ typedef用法小结 (※不能不看※)

[亡魂溺海] 提交于 2020-02-10 11:19:32
C++ typedef用法小结 (※不能不看※) 第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如: struct tagPOINT1 { int x; int y; }; struct tagPOINT1 p1; 而在C++中,则可以直接写:结构名 对象名,即:tagPOINT1 p1; 估计某人觉得经常多写一个struct太麻烦了,于是就发明了: typedef struct tagPOINT { int x; int y; }POINT; POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候 或许

为什么指针需要有类型?

可紊 提交于 2020-02-10 05:38:16
有一个问题,那就是既然指针都是4字节,为什么要有不同类型的指针,只有一个不就好了吗? 愿意有两个: 1.为了地址增量的方便 看这个例子 #include<iostream> using namespace std; int main(){ double b = 13; double *p_b = &b; int a = 9; int *p_a = &a; cout<<"char pointer: "<<p_b<<" "<<p_b+1<<endl; cout<<"int pointer: "<<p_a<<" "<<p_a+1<<endl; return 0; } double pointer: 0x22cc20 0x22cc28 int pointer: 0x22cc1c 0x22cc20 输出如上所示,double型的地址增量为8,而int型指针的地址增量为4,虽然一个指针的大小始终是四字节。如果没有指针类型,增量的大小是不是就要用户自己定义了呢?这样就很不方便了,有了类型,编译器就能很方便地帮用户做这件事了(当然用户也很方便了)。 2.为了类型安全 定义指针的类型帮助编译器发现你是否用了错误的类型,这也是C为什么要有类型的最初原因。 来源: https://www.cnblogs.com/drunknbeard/p/9502386.html