指针

双向链表大型攻略

两盒软妹~` 提交于 2020-03-16 20:35:32
我们之前已经做了链表的大型攻略。包括如何创建一个链表,插入节点,打印数据,删除节点等常用的功能。我们通常将这种每个节点有一个数据段和一个指向下个节点指针的链表为 单向链表 。我想通过某一个节点能找到下一个节点,但是如果我想通过该节点找到上一个节点呢?这几乎是不可能的。除非我将单向链表首尾相连构成环形的单向循环链表,走一个循环之后就可以找到其上一个节点的数据了,但是这有过于麻烦,为了解决这种问题,我们引入了 双向链表 ,也就是说在一个节点上不仅有指向下一个节点的指针,还有另外一个指针指向上一个节点。 没错,每一个节点就长这个样子,有两个指针,当然了我们给他们不容的名字,并将他们分别指向上一个和下一个节点: 当然了也需要有一个头指针和头节点 其实双向链表和单向链表的区别仅仅就是每个节点多了一个指向上个节点的指针,所以我们在操作时要多做一个指向的步骤。 我们首先 创建一个节点 ,要记得是2个指针 typedef struct Node { int data; struct Node *prev; struct Node *next; }node; 用刚才的结构体写一个函数, 新建节点 ,和之前的单向链表别无二致 /************************* *函数功能:新建节点 *输入参数:节点所存数据 *返 回 值:节点指针 **************************

C和指针第三章答案

て烟熏妆下的殇ゞ 提交于 2020-03-16 20:23:56
1.MB_LEN_MAX 规定一个多字节字符最多允许的字符数量。 7. 值为整数,打印的时候而用 %s 则无法判断出来的是什么东西。 11. 浮点型通常会比 int 表示的数多,因为 0 可能有几种表达形式。 13.Const 不能赋值。 23. 自己编的: char b = 2; void x (void) { extern int a = 1; int c = 3; static float d = 4; } void y (void) { } 答案: y 在 x 前 static char b=2; void y(void) { } int a=1; void x(void) { intc=3; static float d=4; } 24.当 extern 关键字用于源文件中第一次标识符的第一次声明时,他指定其 linkage 为 external 的,担当如果用于该标识符的第二次或以后的声明时,他并不会改变第一次声明所指定的 linkage 。 函数里面的参数初值: The initial value of a function parameter is the argument that was passed when the function was called. 来源: https://www.cnblogs.com/frechei/archive/2013/03

C和指针

眉间皱痕 提交于 2020-03-16 20:23:01
1.指针数据类型 变量的值存储于计算机的内存中,每个变量占据一个特定的位置,每个内存位置都由地址唯一确定并引用。指针只是 地址的另一个名字罢了。指针变量就是一个其值为另一个内存地址的变量。 1.1 指针常量 指针常量与非指针常量在本质上是不同的,因为编译器负责把变量赋值给计算机内存中的位置,程序员事先无法知道某个特定的变量将存储到内存的哪个位置。因此,你通过操作符获得一个变量的地址而不是直接把它的地址写成字面值常量的形式。事实上,当一个函数每次被调用时,它的自动变量(局部变量)可能每次分配的 内存位置都不相同,因此把指针常量表达为数值字面值的形式几乎没有用处,所以C语言内部没有特地定义这个概念。 1.2 static关键字 当用于不同的上下文环境时,static关键字具有不同的意思。 当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal。但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件内访问。 当它用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。 来源:

c++ 引用 指针。

為{幸葍}努か 提交于 2020-03-16 12:18:12
一、什么是引用(reference) ?已经存在的对象的另外一个名字。   引用有什么不同的?     1.引用在定义时,以&开头。     2.引用不是对象,只能绑定在对象上。所以必须在初始化的时候,指定引用绑定的对象。而且引用绑定是不可以改变的。       int val = 0;       int &refVal = val; // 不允许 int &refVal; 这样初始化     3.就像使用变量名一样,对引用赋值,实际上是给该引用绑定的对象赋值,获取引用的值,也同样是获取与该引用绑定的对象的值。       int &refVal2 = refVal ;// refVal2绑定到了val上面。       int copyVal = refVal; // 初始化copeVal为val的值。 二、什么是指针(pointer)? 存放着某个对象所在地址的 对象 。   和引用的区别是,指针可以被更改。不必须初始化,尽管一般会初始化。   1.指针在定义时,以*开头。赋值时需要使用取地址符(&)来得到某个对象的地址。 在C++中,相同的符号,在不同的情况使用,意义不同,就像不同的符号。     int val = 0;     int *p = &val; //p存放val的地址, 即 p是指向val的指针。指针类型一般必须和指向的对象类型完全一致。   2

关于select命令

女生的网名这么多〃 提交于 2020-03-16 11:53:38
某厂面试归来,发现自己落伍了!>>> Select命令选择基于用户定义标准的标签群、启动单元(U)、相交和基于标签分块的否定(~)。询问机发送连接Select命令执行U和操作。Select命令可以确认或取消确认适用于四个通话的标签的SL标记,或者可以在四个通话的其中一个通话中将标签的已盘标记设置为A或B。 询问机和标签应如表6.18所示执行Select命令。目标应表示该Select命令是否修改标签的SL标记或已盘标记,如果是在已盘标记的情况下,则表示是否为某通话修改SL标记或已盘标记。动作应执行如表6.19所示的标签应答。决定标签是否匹配的标准在存储体、指针、长度和掩模字段中有规定。 截断表示标签反向散射的应答是否在被截断后只包括掩模后的EPC和CRC-16 。Select命令要经过从询问机到标签的以下参数: 目标表示Select命令是否修改标签的SL标记或已盘标记,如果是在已盘标记的情况下则进一步规定四个通话的其中一个通话。修改SL标记的Select命令不应修改已盘标记,反之亦然。 动作表示匹配标签是否确认或取消确认SL标记,或是否将其已盘标记设置到A或B。符合存储体、指针、长度和掩模字段内容的标签为符合标签。不符合上述字段内容的标签为不符合标签。 存储体规定掩模是否应用于EPC、TID或用户存储体。Select命令应用于单个存储体。连续Select命令可应用于不同的存储体

第三次作业

孤街浪徒 提交于 2020-03-16 08:58:10
一.观看了字符串操作,单字符串输入输出,字符串数组。 二.练习 三.问题 1.malloc如何控制申请空间的大小? x=(struct node *) malloc(sizeof(struct node)) sizeof(struct node) //struct node占用的字节数。 malloc(sizeof(struct node)) //struct node占用字节数大小的空间 (struct node *) malloc(sizeof(struct node)) //将申请的空间的地址强制转化为 struct node * 指针类型 x=(struct node *) malloc(sizeof(struct node)) //将那个强制转化的地址赋值给 x 2.字符串数组 解决:把字符串数组看成二维字符数组 3.PTA 问题 1-2 执行语句int *p=1000;后,指针变量p指向地址为1000的变量。 (1分) F int *p=1000,是p的地址成为1000. 1-6 关于C语言指针的运算:指针只有加减操作,没有乘除操作。指针可以加常数、减常数;相同类型的指针可以相加、相减。 (2分) F 2.程序填空 #include <stdio.h> void find(int *, int, int *, int *); int main(void) { int

深入理解计算机系统之程序的机器级表示部分学习笔记

那年仲夏 提交于 2020-03-16 08:08:11
不论我们是在用C语言还是用JAVA或是其他的语言编程时,我们会被屏蔽了程序的机器级的实现。机器语言不需要被编译,可以直接被CPU执行,其执行速度十分 快。但是机器语言的读写性与移植性较高级语言低。高级语言被编译后便成为了汇编语言,汇编语言 十分接近 机器语言。之后汇编代码会转化为机器语言。虽然现代 的编译器能帮助我们将高级语言转化为汇编语言,解决了不少问题,但是对于一个严谨的程序员来说,需要做到能够阅读和理解汇编语言。我们主要围绕Intel来讲 解。 一 Intel处理器的历史演变 Intel处理器最的早是8086, 它是 十六 位的微处理器,作为第一代单芯片,8086知名度是相当的高。之后又有80286、i386、i486、Pentium、PentiumPro、 Pentium/MMX、PentiumⅡ、PentiumIII等等的一系列处理器出现了。每个时间上相继的处理器都是向后兼容的。Intel称其指令集为IA32,也就是Intel32位体系结 构,也就是我们平常所说的x86。 二 程序编码 我们写一个C程序,用Unix命令行编译p1.c和p2.c两个文件。即为 unix> gcc -02 -o p p1.c p2.c 其 中 -02 告诉编译器使用第二级优化。而二级优化则是在性能优化与使用方便之间一个最好的权衡。所以代码经常使用二级优化。 (1)机器级代码

container_of宏剖析

我的未来我决定 提交于 2020-03-16 06:45:14
container_of宏剖析 //该宏位于include/linux/kernel.h 1.定义格式 /** * container_of - cast a member of a structure out to the containing structure * * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in. * @member:the name of the member within the struct. * */ #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 作用:就是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。 例: struct demo_struct { type1 member1; type2 member2; type3 member3; } struct demo_struct demo1,*pdemo; type2 *

双指针法的应用实战

不打扰是莪最后的温柔 提交于 2020-03-16 00:18:50
双指针法的应用实战 什么是双指针?    双指针 ,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向( 快慢指针 )或者相反方向( 对撞指针 )的指针进行扫描,从而达到相应的目的。 快慢指针示例: 26-删除排序数组中的重复项   这里是定义快慢两个指针。快指针每次增长一个,慢指针只有当快指针上的值不同时,才增长一个(由于是有序数组,快慢指针值不等说明找到了新的值) public int removeDuplicates(int[] nums) { int k = 0;//在nums中[0,k]中的数字无重复 //遍历第i个元素后,保证[0……i]中的所有不重复元素都 //按照顺序排列在[0……k]中 for (int i = 1; i < nums.length; i++) if(nums[i] != nums[k] ) nums[++k] = nums[i]; return k+1; } 27-移除元素   该题也是定义快慢两个指针。快指针每次增长一个,慢指针只有当值不同时才增长一个。 public int removeElement(int[] nums, int val) { int k = 0;//在nums中[0,k)中的数字不等于val //遍历第i个元素后,保证[0……i]中的所有不等于val的元素都 //按照顺序排列在[0……k)中

C语言字符串中的指针与数组

≡放荡痞女 提交于 2020-03-15 21:52:56
先说一下字符串字面量(字符串常量):双引号中的字符和编译器自动加入末尾的\0字符,都作为字符串储存在内存中。字符串常量属于静态存储类别,说明如果在函数中使用字符串常量,该字符串只会储存一次,在整个程序的生命周期内存在,即使函数被调用多次。用双引号扣起来的内容被视为指向该字符串储存位置的指针。 字符串的赋值可以用指针与数组,请看下面的例子 char str1[] = "I am a student"; const char *str2 = "I am a student too"; 以上两种表示方法还是有一些不同的 先说数组表示法,数组形式str1[]在计算机的内存中分配一个内含15个元素的数组(末尾还要加上空字符'\0'),当程序载入内存时,也载入了程序中的字符串,字符串存储在静态存储区中,但是当程序在开始时才会为该数组分配内存,此时才将字符串拷贝到数组中,注意此时字符串有两个副本,一个是静态存储区中的常量,另一个是存储在数组中的字符串。str1为首元素的地址(&str1[0]),是常量地址,不能更改,可以进行str1+1(&str1[1]),但是不允许str++这样的操作,因为递增运算符只能对变量名进行运算。 指针形式(*str2)也使得编译器为字符串在静态存储区预留19个元素空间,一旦开始执行程序,它会为指针变量str2流出一个储存位置,并把字符串的地址储存在指针变量中