数据结构与算法基础之概述、指针与内存

数据结构的定义

  我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序而执行的相应操作,这个操作也叫算法)

  数据结构 = 个体 + 个体的关系

  算法 = 对存储数据的操作

  衡量算法的标准:

  •     时间复杂度:大概程序要执行的次数,而非执行的时间
  •     空间复杂度:算法执行过程中大概所占用的最大内存
  •     难易程度
  •     健壮性

内存的基本概念:

  1.内存是用来存储数据的设备。它的存储速度介于寄存器和硬盘之间。

  2.内存是CPU唯一可以访问的大容量的存储设备,所有硬盘中的程序和数据必须调入内存之后方可被CPU执行。注:CPU不能直接处理硬盘中的数据!

  3.内存的问题是软件开发中最核心的问题之一!如:内存的分配、释放,内存什么时候分配、什么时候释放?由谁来分配、释放?分配在什么地方?访问权限如何?

  4.内存是多字节组成的线性一维存储空间。

  5.内存的基本和划分单位是字节。

  6.每个字节含有8位,每一位存放1个0或1个1。

  7.字节和编号一一对应。每个字节都有一个唯一确定的编号,一个编号对应一个字节,这个编号也叫字节。

  8.一个系统所能管理的内存空间的大小取决于参与编号的二进制位数。 如:DOS系统20位寻址方案,可控制2^20B即1MB的内存。

软件运行与内存关系(垃圾数据)

  内存是在操作系统的统一管理下使用的!

  1.软件在运行前需要向操作系统申请存储空间, 在内存空闲空间足够时,操作系统将分配一段内存空间并将外存中软件拷贝一份存入该内存空间中,并启动该软件的运行!

  2.在软件运行期间,该软件所占内存空间不再分配给其他软件

  3.当软件运行完毕后,操作系统将回收该内存空间(注:操作系统并不清空该内存空间中遗留下来的数据),以便再次分配给其他软件使用。 综上所诉,一个软件所分配到的空间极可能存在着以前其他软件使用过后的残留数据,这些数据称之为垃圾数据。所以通常情况下我们为一个变量、数组,分配好存储空间之后都要对该内存空间初始化!

指针的定义

  指针即地址,地址是内存单元的编号,范围是0~2^8-1的非负整数,不可重复,但所存内容可以重复。 指针变量就是存放内存单元地址的变量,不能存放内存单元内容。

 1 #include<stdio.h>
 2 int main(){
 3     int *p; //p是个变量的名字,int*表示该P变量只能存储int类型变量的值,而不能存char或其他类型变量的值
 4     int i = 10;
 5     int j;
 6     //p = &j; //由于j没有赋值,所以p不会接收不确定单元的地址,p会被内存填充为一个垃圾数字
 7     p = &i;  //把i的地址给指针变量p
 8     j = *p;  //由于指针p接收了变量i的地址,*p表示把i变量地址的值取出来,再赋值给j
 9
10     printf("i = %d,j = %d,*p = %d",i,j,*p);  //都输出10
11     return 0;
12 }

硬件被操作系统控制,编译器请求操作系统分配内存给变量,当程序运行完,内存会被回收 ,但数据变成了垃圾数据,并没有被清除。

如何通过被调函数修改主调函数中普通变量的值?

  1.实参为相关变量的地址

  2.形参为以该变量的类型为类型的指针变量

  3.在被调函数中通过 *形参变量名的方式,就可以修改主函数变量的值

 1 #include<stdio.h>
 2 void f(int *p){
 3     *p = 100;
 4 }
 5 int main(){
 6     int i = 9;
 7     f(&i);
 8     printf("%d",i);//输出100,而不是9
 9     return 0;
10 }

原文地址:https://www.cnblogs.com/sunbr/p/11247305.html

时间: 2024-08-30 07:44:17

数据结构与算法基础之概述、指针与内存的相关文章

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操

数据结构与算法基础 模块一

在软件水平考试中,数据结构与算法基础的相关内容是考试上午进行的,那么,接下来将对有关数据结构的内容进行整理和归纳,以便于在整个的软考准备阶段能够更加清楚和有效率的进行学习和回忆. 以下均为个人针对于数据结构的相关内容的整理,后期根据深入的程度不断地完善和改进,如果有什么错误或者不足,希望可以提出来,一起进步. 常用的数据结构:      数组(静态数组,动态数组),线性表,链表(单向链表,双向链表,循环链表),队列,栈,树(平衡数,二叉树,查找树,堆,线索树),图等的定义,存储和操作,HASH(

数据结构与算法基础

数据结构与算法基础: 顺序存储结构 链式存储结构 什么是树结构?为什么使用树结构?树的基本概念 二叉树: 任何一个节点的子节点数量不超过2 二叉树的子节点分左节点和右节点 满二叉树:所有的叶子节点都在最后一层,而且节点总数为2的n次方-1[n是树的高度]完全二叉树:所有叶子节点都在最后一层或者倒数第二层,且最后一层的叶子节点在左边连续,倒数第二节的叶子节点在右边连续 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组.在C语言

数据结构与算法基础之指针和数组

指针和数组: 指针和一维数组: 数组名: 一维数组名是个指针常量 它的值不能被改变 它存放的是一维数组里第一个元素的地址 一维数组名指向的是数组的下标为0的第一个元素. 下标和指针的关系: 1 a[i]<<==>>*(a+i)<<==>>*(i+a)<<==>>i[a] //符号表示等价于 1 #include<stdio.h> 2 int mian(){ 3 int a[5]; 4 printf("%p,%p&

数据结构与算法基础 模块六

简单选择排序: 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(R,R[i+1],-,R[n]中找出排序码最小的记录,与第i个记录交换.执行n-1趟 后就完成了记录序列的排序. 代码如下: public  void SimpleSelect() { int[] inputIntArray = new int[8] { 8, 4, 7, 5, 2, 3, 6, 1 }; for (int i = 1; i < inputIntArray.Length; i++) { i

数据结构与算法基础 模块七

二叉树的补充: 线索二叉树: 1.引入线索二叉树 二叉树的遍历实质上是对一个非线性结构实现线性化的过程,使每一个节点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继.但在二叉链表存储结构中,只能找到一个节点的左.右孩子信息,而不能直接得到节点在任一遍历序列中的前驱和后继信息.这些信息只有在遍历的动态过程中才能得到,因此,引入线索二叉树来保存这些从动态过程中得到的信息. 2.建立线索二叉树 为了保存节点在任一序列中的前驱和后继信息,可以考虑在每一个节点中增加两个指针域存放遍历

数据结构之算法基础

算法:  大O表示法: 代码(求出数组中出现次数最多的数字): 原文地址:https://www.cnblogs.com/souhaite/p/11030245.html

数据结构与算法基础之非循环单链表创建和链表遍历

1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 //函数声明 5 PNODE create_list();//返回值是链表头结点的地址 6 void traverse_list(PNODE pHead); 7 8 typedef struct Node{ 9 int data;//数据域 10 struct Node * pNext;//指针域 11 }NODE,*PNODE;//NODE等

数据结构与算法基础之非循环单链表节点的操作

插入节点 1 //写法一: 2 r = p->pNext; //r为临时变量 3 p->pNext = q; //q为要插入的节点地址 4 q->next = r; 5 6 7 //写法二: 8 q->pNext = p->pNext; //将原来指向下一节点的指针域赋值给插入的节点的指针域 9 p->pNext = q; //原来的节点的指针域被赋值了插入的节点的地址 删除节点 1 r = p->pNext; 2 //将要删除的节点的地址赋值给临时变量,方便最后