《数据结构》-c-basics_第1页
《数据结构》-c-basics_第2页
《数据结构》-c-basics_第3页
《数据结构》-c-basics_第4页
《数据结构》-c-basics_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构中的C语言基础,黄庆华 副教授电信学院,数据结构中的关键基础,指针结构体(如果同学们对以上内容掌握较好,则可跳过本章),S1. 指针,S1. 1 地址和指针的概念,一、指针概述:1、地址的概念与取地址运算: 内存以字节编码,每个编码都是一个地址。 我们原先学过的变量、数组、函数等都放在内存中,我们只需知道它们是以怎样的顺序放在内存中的,以便一一按顺序引用。我们怎样知道机器将某种数据放在内存的什么地方呢? 可用求地址运算符 看出其地址。 注意,这个地址并不是始终不变的,这是由机器和操作系统来安排的,我们无法预先知道。,在数组中,数组名代表数组的首地址,故a表示的地址和&a 0的地址相同。但&不能施加在常数、常量或表达式上,也不能施加在寄存器变量上(因为寄存器变量在cpu中,不在内存中)。二、指针变量: 既然存储在内存中的各种变量都有一个地址,我们能否这样设想:定义某种变量,让这个变量的值等于某个变量的地址,如同某个房间号、门牌号一样? 回答是肯定的。我们把这种存放某种变量地址的变量称为指针变量。,a,b,2010,2012,因此,在C语言中,将地址形象化地称为指针,说明(系统对变量的访问形式分为两种)一个变量的访问(访问是指取出其值或向它赋值)方式有两种:直接访问:通过变量名访问,如通过变量名i直接访问。间接访问:通过该变量的指针来访问,如通过指针p访问变量i。,S1.2.1、定义指针变量存储类型 数据类型 * 指针变量名1 ,* 指针变量名2, ; 如: int *p, a = 10; int *q, b=35;,S1.2 变量的指针和指向变量的指针,如何使一个指针变量指向另外一个变量呢?,P=,a,b,2010,2012,为什么要为指针变量定义类型?由于不同的数据有不同的数据类型(如 char仅占一个字节、int 占两个字节、float型占四个字节),而内存又是以字节为单位进行地址编号,因而对char型,只要地址数加减1,取出里面的数据就是char型的完整数据。对int型就不同了,要取出其中的数据需2字节,就不能对地址进行简单的加减1了。怎样取出一个完整的int型数据或float型数据呢?如果能够将指针变量也定义为具有同样的数据类型,那么对指针进行加1或减1运算,就是让指针移动相应基类型对应的字节数。,2byte,S1.2.2 指针变量赋值和引用(要用到取地址运算符“,二、指针变量的引用1、取地址运算:如: int *p , i=3, j=5; p= /* 给指针p所指向的变量赋值,这里是给变量a赋值 */,Examples,例1main( ) int *p1, *p2, a1, a2; scanf(“%d %d” , 这里有一个运算符*,其作用是:加在指针变量的前面,取出该指针变量所指变量的内容。,例 2 使两个指针变量交换指向。 main( ) int *p1, *p2, *p, a1=3, a2=5; p1=,交换前,下面表示p1和p1交换所指内容,交换后,交换后,交换前,例3 交换两个指针变量所指向的变量的值。main( ) int *p1, *p2, a1, a2, a; a1=3; a2=5; p1=,S1.2.3 指针变量作为函数参数,变量可以作为函数参数,指针变量同样可以作为函数参数。指针变量作为函数参数时,同样是从实参单向传递指针变量的内容给形参,只是传递的内容是一个地址值。可以通过这个地址值间接改变实参、形参所共同指向的变量。也就是通过改变地址所指向的变量。,程序3:函数参数使用指针变量,在函数中交换指针变量所指向的变量的值情况。void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=ptemp;main()int a=5,b=10;int *pa,*pb;pa=,S1.3 数组的指针和指向数组的指针变量,数组:相同类型元素构成的有序序列。数组元素的指针:数组元素在内存中占据了一组连续的存储单元,每个数组元素都有一个地址,数组元素的地址就是数组元素的指针。数组的指针:就是数组的地址。数组的地址指的是数组的起始地址(首地址),也就是第一个数组元素的地址。C语言还规定数组名代表数组的首地址。,S1.3.1 指向数组元素的指针,定义一个指向数组元素的指针变量的方法,与以前介绍的定义指向变量的指针变量相同。格式:数组基类型 *指针变量名; 指针变量名=数组名;/*指针变量名= 或者 int *p=a;,S1.3.2 通过指针引用数组元素,指针p+i的含义不是地址值p增加i个字节后的地址值,而是指p向后移动i个基类型元素后的地址值。p-i,p+,p-都有类似的含义。,指针与数组的关系,数组元素在内存中连续存放,如果指针p指向数组a,那么,p+i指向数组a的第i个元素ai。即:p+i=&ai,此时对ai的访问完全可以转化为对*(p+i)的访问。数组与指针的关系:数组元素可以用下标访问也可以使用指针访问。,3.通过指针引用数组元素 数组元素的地址表示。假如:p定义为指向数组a的指针。数组元素ai的地址可以表示为:&ai,p+i,a+i。数组元素的访问例如:数组元素ai的访问可以是:ai,*(p+i),*(a+i)。数组指针变量,数组名在许多场合甚至可以交换使用。假如:p=a,那么ai甚至可以表示为pi(指针变量带下标),注意:数组名,数组指针变量使用时的区别:数组名是常量指针,它指向数组首地址,数组指针变量是变量,它的值可以改变。在不至于混淆的场合,数组名,数组指针变量可以统称数组指针。例如:假设a、b是数组名,p是同类型的数组指针变量。a+; *(a+); a=a+i; a=b; 错误而p+; *(p+); p=p+i; p=a;都是正确的。,S2. 结构体,S2.1 概述,C语言程序中少量变化的数据用变量来处理。数量不宜多。批量同类型数据的处理用数组。不同类型的数据的集合用什么数据结构来存放呢?这就是本单元要介绍的内容:用结构体类型处理不同类型数据的集合。,结构体名,类型名,成员名,声明一个结构体类型的一般形式为: struct 结构体名 成员表列;如: struct student int num;char name20;char sex; int age;float score;char addr30; ;,(1)间接定义法先定义结构类型、再定义结构变量例如,定义的学生信息结构类型std_info,定义了一个相应的结构变量student: struct std_info student;结构变量student:拥有结构类型的全部成员,其中birthday成员是一个日期结构类型,它又由3个成员构成。注意:使用间接定义法定义结构变量时,必须同时指定结构类型名。,S2.2 定义结构体类型变量的方法,(2)直接定义法在定义结构类型的同时,定义结构变量例如,结构变量student的定义可以改为如下形式:struct std_info student;同时定义结构类型及其结构变量的一般格式如下: struct 结构类型名 结构变量表;,2.说明(1)结构类型与结构变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。(2)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。,(3)“结构类型名”和“数据项”的命名规则,与变量名相同。(4)数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。 例如,本案例代码中的日期结构类型,也可改为如下形式: struct date int year, month, day; ;(5)结构类型中的数据项,既可以是基本数据类型,也允许是另一个已经定义的结构类型。(6)本课程将个数据项称为结构类型的个成员(或分量)。,S2.3结构体变量的引用,在定义了结构体变量以后,当然可以引用这个变量。但应遵守以下规则: (1)不能将一个结构体变量作为一个整体进行输入和输出。例如: 已定义student1和student2为结构体变量并且它们已有值。printf(%d,%s,%c,%d,%f,%n,student1);错,引用结构体变量中成员的方式为结构体变量名.成员名例如, student1.num表示student1变量中的num成员,即student1的num(学号)项。可以对变量的成员赋值,例如:student1.num=10010;“.”是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把student1.num作为一个整体来看待。上面赋值语句的作用是将整数10010赋给student1变量中的成员num。,可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如: scanf(%d, (输入student1.num的值) printf(%o,student1); (输出student1的首地址),但不能用以下语句整体读入结构体变量,例如: scanf(%d,s,c,d,f,s,student1); 结构体变量的地址主要用作函数参数,传递结构体变量的地址。,S2.4 结构变量的初始化结构变量初始化的格式,与一维数组相似: 结构变量=初值表不同的是,如果某成员本身又是结构类型,则该成员的初值为一个初值表。例如:student=“000102”, “张三”, “男”, 1980,9,20;注意:初值的数据类型,应与结构变量中相应成员所要求的一致,否则会出错。,S2.5 结构体数组,一个结构体变量中可以存放一组数据(如一个学生的学号、姓名、成绩等数据)。如果有个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与以前介绍过的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员(分量)项。,与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。与普通数组一样,结构数组也可在定义时进行初始化。初始化的格式为:结构数组n初值表1,初值表2,.,初值表n,S2.5.3 结构体数组应用举例,例:对候选人得票的统计程序。设有3个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include #include struct person char name20;in count; ;leader3=“Li”,0, “ Zhang”,0, “ Fan”,0;,S2.6 指向结构体类型数据的指针,一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论