指针

[数据结构]-04顺序表和链表

妖精的绣舞 提交于 2020-01-13 08:51:22
顺序表 按照顺序存储方式存储的线性表称为顺序表。 什么是有序顺序表? 若顺序表中的元素按其值有序,则称其为有序顺序表。 顺序表的插入 设顺序表 A A A 的长度为 n n n ,将字段值为 i t e m item i t e m 的元素插入到第 i i i 个位置,插入步骤如下: 保证顺序表存储空间未满,并且插入位置合法 将第 i i i 个位置元素及其之后的所有元素后移一个位置 插入成功后,线性表长度变为 n + 1 n+1 n + 1 顺序表的删除 设顺序表 A A A 的长度为 n n n ,删除第 i i i 个位置的元素,删除步骤如下: 保证删除位置合服性 将第 i i i 个位置之后的所有元素前移一个位置 删除成功后,线性表长度变为 n − 1 n-1 n − 1 顺序表总结 特点:存储地址连续,数据元素存储依次存放;数据元素类型相同,数据元素可随机存取 优点:存储空间的利用率高,存取速度快,适用于存取需求多的线性表 缺点:静态存储形式,数据元素的个数不能自由扩充 (受存储空间的限制);在插入、删除某个元素时,需要移动大量元素 单链表 结点只有一个指针域的链表成为单链表。 数据域 d a t a data d a t a 存放该结点的数据域的值,指针域 n e x t next n e x t 存放该结点的后继结点的地址信息。 什么是空链表? 若表中只有头结点

错题集

僤鯓⒐⒋嵵緔 提交于 2020-01-13 07:24:18
错题集 直接访问就是直接利用变量的地址直接进行访问。 (√) //直接访问就是系统直接将变量所在内存单元的值取出,间接访问是直接访问变量地址。 结构体类型本身不占用内存空间,结构体变量占用内存空间。 (√) // 结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。结构体类型的定义就是结构体的声明,不管是定义还是申明,这句话都是正确的。只有在结构体变量,声明的时候可以分配。要使用结构体,那么就需要创建变量,也就是结构体变量。 文件指针用于指向文件,文件只有被打开后才有对应的文件指针。 (√) //文件指针是指向一个文件的指针,确切的将是指向用文件这个结构体所定义的对象的起始地址。 变量被定义后 , 它的作用域和寿命就被确定了 , 并且不可改变。 (√) //作用域就是一个变量可以被引用的范围,生命周期就是这个变量可以被引用的时间段。每个作用域都有相对应的生命周期,变量被定义后,作用域和生命周期就被确定了 , 并且不可改变。 两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。(√) //实际上是两个指针值(地址)相减之差再除以该数组元素的长度(字节数)。 在c语言中,不允许有常量的数据类型是(B ) A.整型 B.结构型 C.字符型 D.字符串 //结构型是基本数据类型的组合,没有单独的常量。 文件指针和位置指针都是随着文件的读写操作在不断改变

2.12一级指针的值修改

ぃ、小莉子 提交于 2020-01-13 05:19:09
【注:自己从老师讲解出理解的,不对的地方望指正】 【注:本程序验证是使用vs2013版】 #include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) int main(void){ char buf[] = "abcde"; /*1、修改指针的值(改变指针的指向)*/ char *a = NULL; printf(" a:%d\n", a); a = &buf[0]; //改变指针变量(就是改变指针的指向),a指向了数组buf的首地址 printf(" a(1):%d\n", a); printf("*a(1):%c\n", *a);/这里应该是a[0]   a = a + 1; //改变指针变量(就是改变指针的指向) //此处等价于 p = &buf[0+1] printf(" a(2):%d\n", a); printf("*a(2):%c\n", *a); //指针的一个长度时4,字符串的一个长度也是4, p -> a p+1 -> b /*2、不断改变指针的指向*/ char *b = NULL; b = &buf[0]; //等价于 b = buf ; for (int i = 0; i < strlen(buf); i++){ b++; //等价于 b

指针|判断其Ascii值最小或最大的元素输出|大一在校大学生|C语言日常作业

有些话、适合烂在心里 提交于 2020-01-13 04:55:14
思路:指针指向各个元素的地址来循环判断大小,判断一次,赋值一次。 # include <stdio.h> void main ( ) { char * p , b [ 10 ] , min ; printf ( "请输入十个字符:" ) ; gets ( b ) ; p = b ; //指针指向字符数组的首地址 for ( min = * p ; p < b + 10 ; p ++ ) //循环判断数组元素中的最小值 if ( * p < min ) min = * p ; printf ( "Ascii值最小的字符为:%c\n" , min ) ; } 来源: CSDN 作者: 鱼儿有梦也会飞翔 链接: https://blog.csdn.net/weixin_45966550/article/details/103743786

第六周编程总结

梦想的初衷 提交于 2020-01-13 03:05:44
一、作业 这个作业属于哪个课程 C语言程序设计ll 这个作业要求在哪里 ( https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 ) 我在这个课程的目标是 理解变量、内存单元和地址之间的关系,掌握指针变量的基本运算 这个作业在哪个具体方面帮助我实现目标 让我大概了解了指针的定义及用法 参考文献 ( https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html ) 基础题 1、求两数平方根之和 函数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=%

typedef 与 define

≡放荡痞女 提交于 2020-01-13 03:02:54
一、typedef的用法 在C/C++ 语言 中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以 增强 程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,它本身并不在编 译过程中进行,而是在这之前(预处理过程)就已经完成了,但也因此难以 发现 潜在的错误及其它代码维护问题,它的实例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一书的条款1中有关于#define语句弊端的分析,以及好的替代方法,大家可参看。 三、typedef与#define的区别 从以上的概念便也能基本清楚,typedef只是为了增加可读性而为标识符另起的新名称(仅仅只是个别名),而#define原本在C中是为了定义常量 ,到了C++,const

基础-内存

不问归期 提交于 2020-01-13 00:53:34
什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为 主存 ,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU 就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算机的稳定运行。 内存的物理结构 在了解一个事物之前,你首先得先需要 见 过它,你才会有印象,才会有想要了解的兴趣,所以我们首先需要先看一下什么是内存以及它的物理结构是怎样的。 内存的内部是由各种IC电路组成的,它的种类很庞大,但是其主要分为三种存储器 随机存储器(RAM):内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会 丢失 。 只读存储器(ROM):ROM 一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。 高速缓存(Cache):Cache 也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和 CPU 之间,是一个读写速度比内存 更快 的存储器。当 CPU 向内存写入数据时,这些数据也会被写入高速缓存中。当 CPU 需要读取数据时

go 指针使用

*爱你&永不变心* 提交于 2020-01-13 00:22:22
参考: https://time.geekbang.org/column/article/18042?utm_source=weibo&utm_medium=xuxiaoping&utm_campaign=promotion&utm_content=columns 指针示例: type Dog struct { name string } func (dog *Dog) SetName(name string) { dog.name = name } 对于基本类型Dog来说,*Dog就是它的指针类型。而对于一个Dog类型,值不为nil的变量dog,取址表达式&dog的结果就是该变量的值(也就是基本值)的指针值。 如果一个方法的接收者是*Dog类型的,那么该方法就是基本类型Dog的指针方法。 从传统意义上说,指针是一个指向某个确切的内存地址的值。这个内存地址可以是任何数据或代码的起始地址,比如,某个变量、某个字段或某个函数。 在 Go 语言中还有其他几样东西可以代表“指针”。其中最贴近传统意义的当属uintptr类型了。该类型实际上是一个数值类型,也是 Go 语言内建的数据类型之一。 再来看 Go 语言标准库中的unsafe包。unsafe包中有一个类型叫做Pointer,也代表了“指针”。 unsafe.Pointer可以表示任何指向可寻址的值的指针

重新认识C语言指针(上)

北慕城南 提交于 2020-01-12 23:38:20
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 <p align="center">本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。</p> <h3 align="center"><a href=" https://github.com/midou-tech/articles " target="_blank"> https://github.com/midou-tech/articles</a></h3&gt ; <h4 style="color:red;text-align:center">点关注,不迷路!!! </h4> 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object(); Object sec= obj;

day 2:数据结果之顺序表和链表

好久不见. 提交于 2020-01-12 20:05:47
1.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入: 1 - > 2 - > 4 , 1 - > 3 - > 4 输出: 1 - > 1 - > 2 - > 3 - > 4 - > 4 思路: 想法 我们可以如下递归地定义在两个链表里的 merge 操作(忽略边界情况,比如空链表等): { list1 [ 0 ] + merge (list1 [ 1 : ] , list2 ) list1 [ 0 ] < list 2 [ 0 ] list2 [ 0 ] + merge (list1, list 2 [ 1 : ] ) otherwise \left\{\begin{array}{ll}{ \text { list1 }[0]+\text { merge (list1 }[1:], \text { list2 })} & {\text { list1 }[0]<\text { list } 2[0]} \\ { \text { list2 }[0]+\text { merge (list1, list } 2[1:])} & {\text { otherwise }}\end{array}\right. { list1 [ 0 ] + merge (list1 [ 1 : ] , list2 ) list2 [ 0 ] +