南邮高级语言程序设计期末总复习模块四 数据类型

发布 2021-04-19 22:32:28 阅读 8378

模块四:数据类型。

c语言源程序中所处理的任何数据(常量或变量)都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小、数据值的表现形式及数据范围、可进行的运算及操作、变量值的组成情况等。

c中数据类型分为:基本类型、构造类型、指针类型、空类型四大类,其中基本类型包括整型、实型、字符型、枚举型;构造类型有:数组类型、结构体类型、共同体类型,指针类型的特殊性在于其变量中存放的是内存地址信息而不是内存中的值。

这一模块的重点是数组、结构体、指针类型。(1)数组类型:

基本知识:一维及二维数组变量的定义及初始化、如何正确访问元素、一维字符数组操作字符串、会正确输入输出数组的元素、正确输出字符串,掌握函数中的一些常用函数的使用,如:两个字符串的比较(例如:

判断串s1是否大于s2,不能用s1>s2,而应该用strcmp(s1,s2)>0)、字符串的赋值、字符串的连接等。算法:首先要理解一维数组名作实参和形式能数传地址的实质;掌握在一维数组中:

输入数组所有元素、输出数组所有元素、寻找最大数、最小数、求元素的平均值、查找某一个值是否是数组中的元素、数组元素逆置、某种常见排序算法等。

数组元素实际个数随着输入动态统计的方法:应当设定一个输入结束标志,在输入该标志之前的元素都依次作为数组的有效元。

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

素,该标志不计入内,用如下**输入以-1为结尾标志的数组并输出所有的有效元素:#include <>void main()while (a[i-1]!=1);num=i-1;

for (i=0;i1、有数组定义inta[m][n],则在a[i][j]之前的元素的个数为___

2、以下一维数组的定义正确的是___

a、int n=3, a[n];b、#define n=3int a[n];

c、const int n=3; int a[n];d、#define n3int a[n*3];3、以下一维数组定义及初始化正确的是___

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

a、int a[ ]b、int a=c、int a[3]=d、int a[3]=

4、以下选择中,能正确定义二维数组的是___a、int x[ ]2];b、int x[ ]2] =c、int x[2][ d、int a[2][3]= 5、若定义inta[10]=;则m[m[1]+2*m[4]]的值是___m+m[8]的值为___6、下列字符数组定义与初始化不正确的是___a、char s[ ]abc”;b、char s=c、char s[3]=;d、char s[3]=”abc”;7、下列关于数组的描述中不正确的是___

a、可以对字符型数组进行整体输入、输出b、可以对整型数组进行整体输入、输出c、利用字符型数组可以实现字符串操作。

d、不能通过赋值运算符“=”对字符型数组进行整体赋值8、下列程序的输出结果是?

#include <>

intf (int *a, int num, int x);void main( )

int a[10]=;int pos;pos=f (a,10,7);printf("%d",pos+1);

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

intf (int *a, int num, int x);

教材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', f;f = t或*f=t均正确;f=t,*f=&t都不正确3、int *f;f = null;正确练习:

1、已知: char *s = student";则printf("%s", 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--的意义,以及数组元素的下标法访问及指针运算符访问方法:例:

intfor (i=0; iif (x ==a[i])return i;return -1;

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

a[4]=,p=a ;+p;p[2]或*(p+2)都是表示元素a[3],但是p+1或a+2都是表示地址概念的,都等于&a[2]各种指针的含义:

int*p ;/一级指针,可等于普通int变量地址、一维数组名、二维数组中的列地址。

int (*p)[3];/一个行指针,指向具有3个整型元素的一维数组,与二维数组一起使用,用于获得行指针值,例int a[2][3] ;p=a;int *p[3];/含3个整型指针元素的一维指针数组pint (*p) (函数指针,指向返回值为int型的函数入口int *p(形式参数表);/返回值为int指针的函数p

int**p ;/二级指针p,用来获得一级指针的地址,必须两次间接寻址才能访问int值,例如:inta,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 a[3][4];

元素a[i][j]的正确表示:a[i][j]、*a[i]+j)、*a+i)+j)、*a+i*4+j),但是*(a+i*4+j)不正确,这里需要正确理解行指针与列指针的表示及它们执行算术运算每次移动的字节数。

用字符指针操作字符串:比用字符数组操作字符串具有更大的灵活性,注意二者的区别。

例:char *s=“abc”;char *s;s=”abc”;都是正确的char p[4]=“abc”;正确,但是char p[4]; p=”abc”;却错误。

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

s=p;是正确的赋值,但是s=*p,*s=”ab”都是错误的练习:下面的函数**是否都能正确实现字符串的拷贝(将p1串拷贝到p2串中?)

**段一:void mystrcpy( char *p2, char *p1 )

while ( p2=*p1) !0' )此处换成n’呢?}

**段二:void mystrcpy( char *p2, char *p1 )

while (*p1 !=0' )

3)结构体类型:会正确定义结构体类型,掌握三种变量定义的方式及变量的初始化方式,理解结构体变量内存占用的情况(各成分依次存放,故结构体变量所占空间至少为所有成员需要的空间之和),会正确访问结构体变量的成员(用点运算符或是箭头运算符),结合结构体数组及指针会正确访问结构体的元素。练习:

1、定义struct pointpos[ ]pt=pos;则表达式(++pt)->y的值为pt->x)的值为pt->x的值为___pt).y的值为___2、以下对结构体变量stu中成员的非法引用是___

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

struct point pos, *p=&pos;

a、>xd、作为函数参数,通常定义结构体的指针作为形式参数,将实参结构体变量的地址传入,这样省时效率高,而且可在被调函数中修改对应实参结构体成员的值练习:下列程序的运行结果是?

#include <>typedef struct student stu;

void f (stu *s)

void main()

stu stu=

f (stu+1);

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

printf("%s%.1f", stu->name, (stu).score);}

利用结构体和指针的递归定义可以实现单链表例:struct node*head;

在单链表中,最重要的是头指针的信息,头指针用于指向单链表。

的第一个结点处,顺着链依次寻找其它的结点,单链表不可随机访问其中的结点,最后一个结点的指针域置为空理解单链表的遍历、插入一个结点、删除一个结点等方法。练习:

1、设以下程序的所有的指针均为上面structnode*变量,已知head为头指针,指针p指向了单链表中的某一个结点处,但肯定不是指向第一个结点和最后一个结点,指针q指向了某一个结点处,该结点不在链表中,下面的**实现的功能是___方法提示:根据描述先画出单链表示意图来)p=p->next;s->next=p->next;p->next=s;

如果p指向的是链表中倒数第二个结点处,则上面**实现的功能为___这时**还可以写成___下面的**的功能是___

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

p->next =p->next->next;delete p->next;下面的**的功能是___

for (p=head; p ; p=q)下面的**的功能是___

p=(struct node*)malloc(sizeof(struct node));p->data=x;p->next=head;head=p;

2、链表中的结点的形成可以有两种方式,一种是静态的,即定义了结构体变量,只是将不同变量的next域作了连接,另一种是利用malloc( )函数逐个申请动态空间,再进行指针间的连接。下面程序**的运行结果是:void main(){

struct node{

intdata;struct node *next

*head,*p , a,b,c;int j;

本文档为精品文档,如对你有帮助请**支持,如有问题请及时沟通,谢谢支持!

p=head->next;

printf("%d ", p->data);

动态申请一个结点空间:p=( struct node*)malloc(sizeof(structnode)),然后才能执行:p->data=…;p->next=…;可以利用指针生成动态数组空间,例如:

int *p;

p=(int *)malloc(sizeof(int));申请一个int空间*/

p=(int *)malloc(2*sizeof(int));申请2个连续的int空间,实现动态一维数组*/

p=(int *)calloc(2, sizeof(int));申请2个连续的int空间,实现动态一维数组*/

南邮《高级语言程序设计》期末总复习模块四数据类型

模块四 数据类型。c语言源程序中所处理的任何数据 常量或变量 都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小 数据值的表现形式及数据范围 可进行的运算及操作 变量值的组成情况等。c中数据类型分为 基本类型 构造类型 指针类型 空类型四大类,其中基本类型包括整型 实型 字符型...

南邮《高级语言程序设计》期末总复习模块四 数据类型

模块四 数据类型。c语言源程序中所处理的任何数据 常量或变量 都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小 数据值的表现形式及数据范围 可进行的运算及操作 变量值的组成情况等。c中数据类型分为 基本类型 构造类型 指针类型 空类型四大类,其中基本类型包括整型 实型 字符型...

南邮高级语言程序设计期末总复习模块四 数据类型

模块四 数据类型。c语言源程序中所处理的任何数据 常量或变量 都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小 数据值的表现形式及数据范围 可进行的运算及操作 变量值的组成情况等。c中数据类型分为 基本类型 构造类型 指针类型 空类型四大类,其中基本类型包括整型 实型 字符型...