




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、模块四:数据类型C语言源程序中所处理的任何数据(常量或变量)都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小、数据值的表现形式及数据范围、可进行的运算及操作、变量值的组成情况等。C中数据类型分为:基本类型、构造类型、指针类型、空类型四大类,其中基本类型包括整型、实型、字符型、枚举型;构造类型有:数组类型、结构体类型、共同体类型,指针类型的特殊性在于其变量中存放的是内存地址信息而不是内存中的值。这一模块的重点是数组、结构体、指针类型。(1)数组类型:基本知识:一维及二维数组变量的定义及初始化、如何正确访问元素、一维字符数组操作字符串、会正确输入输出数组的元素、正确输出字符
2、串,掌握string.h函数中的一些常用函数的使用,如:两个字符串的比较(例如:判断串s1是否大于s2,不能用s1>s2,而应该用strcmp(s1,s2)>0)、字符串的赋值、字符串的连接等。算法:首先要理解一维数组名作实参和形式能数传地址的实质;掌握在一维数组中:输入数组所有元素、输出数组所有元素、寻找最大数、最小数、求元素的平均值、查找某一个值是否是数组中的元素、数组元素逆置、某种常见排序算法等。数组元素实际个数随着输入动态统计的方法:应当设定一个输入结束标志,在输入该标志之前的元素都依次作为数组的有效元素,该标志不计入内,用如下代码输入以-1为结尾标志的数组并输出所有的有效
3、元素:#include <stdio.h>void main()int a100,num=0,i=0;do scanf("%d",&ai+);while (ai-1!=-1);num=i-1;for (i=0;i<num;i+)printf("%5d",ai);printf("n%dn",num);练习:1、有数组定义int amn,则在aij之前的元素的个数为_。2、 以下一维数组的定义正确的是_A、 int n=3, an; B、#define N=3 int aN;C、 const int n=3; i
4、nt an; D、#define N 3 int aN*3;3、以下一维数组定义及初始化正确的是_A、int a ; B、int a=1,2,3 C、int a3=1,2,3,4 D、int a3=,2,4、以下选择中,能正确定义二维数组的是_。A、int x 2; B、int x 2 =2*2;C、int x2 =1,2,3,4 ; D、int a23= , 1 ;5、若定义int a10=9,1,15,6,2,11,8,7,19,3;则mm1+2*m4的值是_,*m+m8的值为_。 6、下列字符数组定义与初始化不正确的是_A、char s =”abc”; B、char s=”abc”;C、
5、char s3=a,b,c; D、char s3=”abc”;7、下列关于数组的描述中不正确的是_。A、可以对字符型数组进行整体输入、输出B、可以对整型数组进行整体输入、输出C、利用字符型数组可以实现字符串操作D、不能通过赋值运算符“=”对字符型数组进行整体赋值8、下列程序的输出结果是?#include <stdio.h>int f (int *a, int num, int x); void main( )int a10=8,6,17,29,34,5,7,23,2,1;int pos;pos=f (a,10,7);printf("%d",pos+1);int
6、f (int *a, int num, int x) int i;for (i=0; i<n; i+) if (x = ai) return i; return -1; ;教材P239的6.3程序填空题,需要认真理解。其中的(3)如果改为统计某一个字母出现的次数,可以作怎样的简化?(2)指针类型:定义形式为:数据类型 *指针变量名,例:int*p;注意p与*p的区别。指针变量若未赋值,不能对*p操作,若对指针赋值为空值,也不能对*p操作。例如:1、 int *f = NULL; scanf("%d",f)或 *f=10.5;都不正确2、 int t = 'A&
7、#39;, *f; f = &t或*f=t均正确;f=t,*f=&t都不正确3、 int *f; f = NULL;正确练习: 1、已知: char *s = "student" 则printf("%sn", c+3)输出为_ 2、若有说明:int a, b=9, *p=&a;,则能完成a=b赋值功能的语句是_A、a=*p; B、*p=*&b; C、a=&b; D、*p =&*b;指针与数组的关系:对指针操作一维数组要熟练掌握,理解数组名是地址常量的概念,指针指向数组的时候执行p+、p- -的意义,以及数组
8、元素的下标法访问及指针运算符访问方法:例:int a4=1,2,3,4 ,*p=a +p;p2或*(p+2)都是表示元素a3,但是p+1或a+2都是表示地址概念的,都等于&a2各种指针的含义:int *p /一级指针,可等于普通int变量地址、一维数组名、二维数组中的列地址int (*p)3;/一个行指针,指向具有3个整型元素的一维数组,与二维数组一起使用,用于获得行指针值,例int a23 p=a;int *p3;/含3个整型指针元素的一维指针数组pint (*p) ( ) ;/函数指针,指向返回值为int型的函数入口int *p(形式参数表); /
9、返回值为int指针的函数pint *p /二级指针p,用来获得一级指针的地址,必须两次间接寻址才能访问int值,例如:int a,int *r=&a,*p=&r 则下列三句等效: (1)a=1 (2)*r=1 (3)*p=1 这里,有几种访问是不正确的:(1) r=1 (2)p=&a (3)p=r (4)*p=1 二维数组中元素的表示:例:int a34;元素aij的正确表示:aij、*(ai+j)、*(*(a+i)+j)、*(*a+i*4+j),但是*(a+i*4+j)
10、不正确,这里需要正确理解行指针与列指针的表示及它们执行算术运算每次移动的字节数用字符指针操作字符串:比用字符数组操作字符串具有更大的灵活性,注意二者的区别例:char *s=“ABC”; char *s; s=”ABC”;都是正确的char p4=“ABC”;正确,但是char p4; p=”ABC”;却错误s=p;是正确的赋值,但是s=*p,*s=”AB”都是错误的 练习:下面的函数代码是否都能正确实现字符串的拷贝(将p1串拷贝到p2串中?)代码段一:void MyStrcpy( char *p2, char *p1 ) while ( (*p2=*p1) != '0
11、9; ) /此处换成.!=n呢?p1+;p2+;代码段二:void MyStrcpy( char *p2, char *p1 ) while (*p1 != '0' ) *p2=*p1p1+;p2+;(3)结构体类型:会正确定义结构体类型,掌握三种变量定义的方式及变量的初始化方式,理解结构体变量内存占用的情况(各成分依次存放,故结构体变量所占空间至少为所有成员需要的空间之和),会正确访问结构体变量的成员(用点运算符或是箭头运算符),结合结构体数组及指针会正确访问结构体的元素。练习:1、定义struct Point int x,y; pos =1,2,3,4,5,6, *pt=p
12、os;则表达式(+pt)->y的值为_ , +(pt->x) 的值为_, +pt->x 的值为_、(*pt).y的值为_。2、以下对结构体变量stu中成员的非法引用是_。struct Pointint x;int y; pos, *p=&pos;A、pos.x B、(*p).y C、p->x D、Point.y作为函数参数,通常定义结构体的指针作为形式参数,将实参结构体变量的地址传入,这样省时效率高,而且可在被调函数中修改对应实参结构体成员的值练习:下列程序的运行结果是?#include <stdio.h>typedef struct Student
13、 char name10;double score; STU;void f (STU *s) (*s).score*=20; printf("%s %.1fn", s->name, (*s).score);void main() STU stu="LiuBo", 4.5, "JiWei", 4.6, "Lijie", 5.0;f (stu+1);printf("%s %.1fn", stu->name, (*stu).score);利用结构体和指针的递归定义可以实现单链表例:stru
14、ct node int data; struct node *next; *head;在单链表中,最重要的是头指针的信息,头指针用于指向单链表的第一个结点处,顺着链依次寻找其它的结点,单链表不可随机访问其中的结点,最后一个结点的指针域置为空理解单链表的遍历、插入一个结点、删除一个结点等方法。练习:1、设以下程序的所有的指针均为上面struct node*变量,已知head为头指针,指针p指向了单链表中的某一个结点处,但肯定不是指向第一个结点和最后一个结点,指针q指向了某一个结点处,该结点不在链表中,下面的代码实现的功能是_? (方法提示:根据描述先画出单链表示意图来)p=p->next;
15、 s->next=p->next; p->next=s;如果p指向的是链表中倒数第二个结点处,则上面代码实现的功能为_,这时代码还可以写成_?下面的代码的功能是_?p->next =p->next->next; delete p->next;下面的代码的功能是_?for (p=head; p ; p=q) q=p->next; delete p; 下面的代码的功能是_?p=(struct node*)malloc(sizeof(struct node);p->data=x;p->next=head;head=p;2、链表中的结点的形成
16、可以有两种方式,一种是静态的,即定义了结构体变量,只是将不同变量的next域作了连接,另一种是利用malloc( )函数逐个申请动态空间,再进行指针间的连接。下面程序代码的运行结果是:void main() struct node int data; struct node *next *head,*p , a,b,c;int j;a.data=10; b.data=20; c.data=30; b.next=&c; c.next=&a; a.next=0;head=&b; p=head->next;printf("%d n", p->data);动态申请一个结点空间:p=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西方政治制度的未来挑战解析试题及答案
- 心态调整西方政治考试成功之道试题及答案
- 探索2025年语言培训行业国际化课程教学效果持续改进研究报告
- 西方政治制度与公共问责机制的构建试题及答案
- 软考网络工程师试题及答案完整性2025年
- 确保软件发布质量的策略试题及答案
- 数字文化产业商业模式创新与文化产业数字化转型趋势研究报告
- 智慧物流在即时配送行业中的应用:2025年配送路径优化与成本控制研究报告
- 网络工程中的关键技术与试题及答案
- 理解干线网络的重要性与试题及答案
- 我国江河湖泊及水资源散布现状
- 基于51单片机的智能门铃设计-正式版
- 2023年不动产登记代理人《不动产登记代理实务》冲刺备考200题(含详解)
- 畜产品市场营销策划方案
- GB/T 18852-2020无损检测超声检测测量接触探头声束特性的参考试块和方法
- ZJUTTOP100理工类学术期刊目录(2018年版)
- F0值计算公式自动
- 《全国统一建筑工程基础定额河北省消耗量定额》宣贯资料
- 道路交通事故现场勘查课件
- 门店电表记录表
- 组态王双机热备
评论
0/150
提交评论