指针

第二次作业

可紊 提交于 2020-03-08 22:13:15
一、指针与数组和指针运算的学习 1.观看视频:1.1.4指针和数组、1.2.1指针运算 2.笔记: 3代码 4遇到的问题 const的指针不能被赋值是因为什么 数组变量是const指针,所以不能被赋值 const指针的准确提法应该是指向const数据的指针,即它所指向的数据不能被修改 请教讨论明白了 NULL和0的值是一样的,都是0,不过它们的表现形式不一样,当要将一个指针赋值为空指针的时候,都应该将它赋为NULL,而不是0 计算p+1和p++结果是一样的,但是计算过程不一样,p++ 落后一个时步,也就是做完一次循环体后它才增加1;p=p+1,在循环体内部,即时增1 来源: https://www.cnblogs.com/a1322264513/p/12444606.html

链表

元气小坏坏 提交于 2020-03-08 21:38:39
一.常见的缓存淘汰策略: 1.先进先出策略FIFO 2.最少使用策略LFU 3.最近最少使用策略LRU 二.链表 (一)链表的定义:链表是物理存储单元上 非连续 的、 非顺序 的存储结构,它由一个个结点,通过指针联系起来的,每个结点包括数据和指针。 (二)链表结构: 1.单链表 通过“指针”将一组零散的内存块串联起来使用。内存块称为结点;记录下个结点地址的指针称为后继指针next;第一个结点为头结点,用来记录链表的基地址;最后一个结点为尾结点,指针指向NULL。 链表的插入、删除操作,只需考虑相邻结点的指针变化,不需要数据搬移,时间复杂度为 O(1) 。 随机访问的时间复杂度为O(n) 。 2.循环链表 是一种特殊的单链表。尾结点的指针指向链表的头结点。 从链尾到链头比较方便。当要处理的数据具有环形结构特点时,适合采用循环链表。例如约瑟夫问题。 3.双向链表 每个结点有两个指针,分别为后继指针next和前驱指针prev。找到前驱结点的时间复杂度为O(1)。 4.双向循环链表 三. 1.删除操作 (1)删除结点中“值等于某个给定值”的结点 从头结点开始一个一个遍历,直到找到值等于给定值的结点,再删除。删除操作时间复杂度为O(1),查找操作时间复杂度为O(n);总时间复杂度为O(n)。 (2)删除给定指针指向的结点 对于单链表来说,要从头结点开始遍历找到给定结点的前驱结点,再删除

指针的算术运算

最后都变了- 提交于 2020-03-08 21:15:00
C++ 指针的算术运算 C++ 指针 C++ 指针 指针是一个用数值表示的地址。因此,您可以对指针执行算术运算。可以对指针进行四种算术运算:++、--、+、-。 假设 ptr 是一个指向地址 1000 的整型指针,是一个 32 位的整数,让我们对该指针执行下列的算术运算: ptr++ 在执行完上述的运算之后,ptr 将指向位置 1004,因为 ptr 每增加一次,它都将指向下一个整数位置,即当前位置往后移 4 个字节。这个运算会在不影响内存位置中实际值的情况下,移动指针到下一个内存位置。如果 ptr 指向一个地址为 1000 的字符,上面的运算会导致指针指向位置 1001,因为下一个字符位置是在 1001。 递增一个指针 我们喜欢在程序中使用指针代替数组,因为变量指针可以递增,而数组不能递增,因为数组是一个常量指针。下面的程序递增变量指针,以便顺序访问数组中的每一个元素: #include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *ptr; // 指针中的数组地址 ptr = var; for (int i = 0; i < MAX; i++) { cout << "Address of var[" << i << "] =

你必须知道的指针基础-6.内存的初始化及结构体的使用

孤者浪人 提交于 2020-03-08 20:58:55
一、内存的使用 1.1 你创建的内存区域可能是脏的   当我们创建一个内存区域的时候,内存中的数据可能是乱七八糟的(可能是其他代码用过后遗留的数据),如下面一段代码: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char chs[20]; // 这个代码打印出来的可能就是乱码,因为printf的%s是“打印一直遇到'\0'”。 printf("%s\n",chs); return 0; }   其运行结果是如下图所示的乱码,因为printf的%s是“ 打印一直遇到'\0' ”。 1.2 解决脏内存区域的办法   那么,如何解决上面我们有可能会访问的脏内存区域呢?在C语言中,可以采用如下的两种方法:   (1)使用memset函数首先清理一下内存: void *memset(void *s, int ch, unsigned n); 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向S的指针。   那么,我们可以使用memset函数来清理内存,即填充创建的这块内存区域: int main(int argc, char *argv[]) { // 下面申请的20个字节的内存有可能被别人用过 char

C语言--指针与多维数组的关系

╄→尐↘猪︶ㄣ 提交于 2020-03-08 20:58:34
人之所以痛苦,那是因为你在成长 。--------magic_guo 多维数组,在某种意义上讲,是数组的数组的数组…。 比如二维数组,相当于数组的数组,即在一维数组的基础上,建立的另一个一维数组。 一维数组和指针的关系是:数组名代表数组中首元素的地址,而在多维数组中也是这样。 只不过多维数组的数组名和一维数组的名,值是一样的,但意义不同。 下面的一切都以二维数组为例: 例如: a = {{1, 2, 3, 4}, {5, 6, 7, 8, 9}, {10, 11, 12, 13}} 二维数组的数组名 a 相当于排长,而二维数组中一维数组的数组名{ a[0], a[1], a[2] }相当于班长。 所以当a指向的是二维数组的首元素地址,a[0]也指向二维数组的首元素地址。但是它们两个的站位不同,也就是含义不同。 所以也就不难来理解为什么a[0]+1 和 *(a+0)+1都是&a[0][1]了。 理解了这个关键点,下面来理解另一个定义: 代码: # include <stdio.h> // 一个班三个学生,各学四门学科, 计算总平均分数以及第n个学生的成绩 int main ( void ) { void average ( float * p , int n ) ; void search ( float ( * p ) [ 4 ] , int n ) ; float a [ 3 ]

数组与指针

倾然丶 夕夏残阳落幕 提交于 2020-03-08 20:07:06
1、数组元素的指针    一 个变量有地址,一个数组包含若干元素,每个数组元紫都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某元素的地址放到一个指针变量中)。所谓数组元索的指针就是数组元素的地址。引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。 /*定义一个指向数组元素的指针变量的方法*/ int a[10]; //定义a为包含10个整型数据的数组 int *p; //定义p为指向整型变量的指针变量 /*应当注意:如果数组为int型,则指针变量的基类型也为int型,下面对该指针变量赋值*/ p=&a[0]; //把a[0]元素的地址赋给指针变量p /*C语言规定,数组名代表数组中首元素的地址*/ p=&a[0] <=> p=a //等价关系 /*注意数组名a不代表整个数组,上述p=a的作用是把a数组元素的首地址赋给指针变量p,而不是将数组a各元素的值赋给p*/ 2、通过指针引用数组元素    假设p已定义为一个指向整型数据的指针变量,并已给它赋了一个整型数组元素的地址,使它指向某一个数组元素。如果有赋值语句:*p=1; 表示将1赋给ρ当前所指向的数组元素。按C语言的规定:如果指针变量p已指向数组中的一个元素,则p

指针与字符串实例练习

老子叫甜甜 提交于 2020-03-08 20:03:22
在C语言中,字符串是存放在字符数组中的,字符串的引用如下: char string[] ="I love China!";//定义字符数组string printf("%s\n",string);//输出整个字符串 printf("%c\n",string[7]);//输出第七个元素 该字符串长度是14,最后一个字节存放字符串结束符'\0'。 例1:通过字符指针变量输出一个字符串。 1 int main() 2 { 3 char *string="I love China!"; 4 printf("%s\n",string); 5 return 0; 6 } 定义一个char*变量,即字符型指针变量string,用字符串常量"I love China!"初始化,把字符串的第一个元素的地址赋给指针变量string,使string指向字符串的第一个字符。 %s使输出字符串格式符,系统会输出string指向的第一个字符,然后自动使string+1,指向下一个字符,直到'\0'为止。 例2:将字符串a复制为字符串b,然后输出字符串b。 1 int main() 2 { 3 char a[]="I am student.",b[20],*p1,*p2; 4 p1=a;p2=b;//指向数组中第一个元素 5 for(;*p1!='\0';p1++,p2++) 6 *p2=*p1; 7 *p2=

C语言指针

夙愿已清 提交于 2020-03-08 20:00:15
10 指针 指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。只要作到这些,指针也是不难掌握的。 10.1 地址指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。 内存单元的指针和内存单元的内容是两个不同的概念。 可以用一个通俗的例子来说明它们之间的关系。我们到银行去存取款时,银行工作人员将根据我们的帐号去找我们的存款单, 找到之后在存单上写入存款、取款的金额。在这里,帐号就是存单的指针, 存款数是存单的内容。对于一个内存单元来说,单元的地址即为指针

DS博客作业01-线性表

白昼怎懂夜的黑 提交于 2020-03-08 19:50:40
0.PTA得分截图 1.1 线性表学习总结 1.线性表的基本概念 线性表是一个具有n个相同特性的有限序列,所有元素都属于同一种数据类型。线性表的逻辑结构简单,便于实现和操作,运用范围广泛。按照存储方式可以分为:顺序表和链表。 2.顺序表 将数据依次存储在连续的整块物理空间中,各结点间的存储单元地址是连续的。 结构体定义 typedef struct node{ ElemType data[MAX]; int length;//保存线性表的长度,或者也可以定义int型变量last用于保存线性表中最后一个数据所在的位置下标。 }Node,*NodeList; 基本操作 顺序表的插入 :实质上就是移动数组的操作,可以从头开始遍历,找到插入的位置后,开始移动数组,或者从末尾开始边移动数组边比较,找到插入的位置后,直接插入; 伪代码: void InserList(NODE & list,int x) { 判断顺序表是否满了,如果满了就return for i=list.length to 0 //从末尾开始一个一个把数据右移,直到找到x的插入位置停止。 if x>list.data[i-1] //找到插入位置,退出循环; break; else list.data[i]=list.data[i-1];//数据进行右移; end if end for list.length++;/

数组与指针

有些话、适合烂在心里 提交于 2020-03-08 19:49:17
一、指针与数组和指针运算的学习 1.观看视频:1.1.4指针和数组、1.2.1指针运算 2.笔记: 3.代码列表 4.遇到的问题 (1)问题:int i; int *p=&i; void *q=(void*)p; 在1.2.1视频中在讲指针类型转换时表示:“上式没有改变p所指的变量的类型而是让后人用不同的眼光通过p看它指向的变量。”不能理解“后人用不同的眼光通过p看它指向的变量”中的不同的眼光。 解决:百度。void *q=(void*)p;将指针p的内容赋值给空类型指针q,并没有改变i或指针p的类型,但在用q读取 int i时,将以指针q的void类型读取i。 (2)问题:在1.1.4代码: #include<stdio.h> void minmax(int a[],int len,int *max,int *min); int main(void) { int a[]={1,2,3,4,5,6,7,8,9}; int min,max; minmax(a,sizeof(a)/sizeof(a[0]),&min,&max); printf("main sizeof(a)=%lu\n",sizeof(a)); printf("min=%d,max=%d\n",min,max); int *p=&min; printf("*p=%d\n",*p); printf("p[0]=%d\n"