
南邮高级语言程序设计期末总复习模块四:数据类型.doc
10页模块四:数据类型C语言源程序中所处理的任何数据(常量或变量)都是属于某一种数据类型的,数据类型将决定该类型的值在内存中占用空间的大小、数据值的表现形式及数据范围、可进行的运算及操作、变量值的组成情况等C中数据类型分为:基本类型、构造类型、指针类型、空类型四大类,其中基本类型包括整型、实型、字符型、枚举型;构造类型有:数组类型、结构体类型、共同体类型,指针类型的特殊性在于其变量中存放的是内存地址信息而不是内存中的值这一模块的重点是数组、结构体、指针类型1)数组类型:基本知识:一维及二维数组变量的定义及初始化、如何正确访问元素、一维字符数组操作字符串、会正确输入输出数组的元素、正确输出字符串,掌握string.h函数中的一些常用函数的使用,如:两个字符串的比较(例如:判断串s1是否大于s2,不能用s1>s2,而应该用strcmp(s1,s2)>0)、字符串的赋值、字符串的连接等算法:首先要理解一维数组名作实参和形式能数传地址的实质;掌握在一维数组中:输入数组所有元素、输出数组所有元素、寻找最大数、最小数、求元素的平均值、查找某一个值是否是数组中的元素、数组元素逆置、某种常见排序算法等数组元素实际个数随着输入动态统计的方法:应当设定一个输入结束标志,在输入该标志之前的元素都依次作为数组的有效元素,该标志不计入内,用如下代码输入以-1为结尾标志的数组并输出所有的有效元素:#include 2、 以下一维数组的定义正确的是___A、 int n=3, a[n]; B、#define N=3 int a[N];C、 const int n=3; int a[n]; D、#define N 3 int a[N*3];3、以下一维数组定义及初始化正确的是____A、int a[ ]; B、int a[]={1,2,3} C、int a[3]={1,2,3,4} D、int a[3]={,2,}4、以下选择中,能正确定义二维数组的是______A、int x[ ][2]; B、int x[ ][2] ={2*2};C、int x[2][ ]={1,2,3,4 }; D、int a[2][3]={ , {1} };5、若定义int a[10]={9,1,15,6,2,11,8,7,19,3};则m[m[1]+2*m[4]]的值是______,*m+m[8]的值为______ 6、下列字符数组定义与初始化不正确的是____A、char s[ ]=”abc”; B、char s[]={”abc”};C、char s[3]={‘a’,’b’,’c’}; D、char s[3]=”abc”;7、下列关于数组的描述中不正确的是______。 A、可以对字符型数组进行整体输入、输出B、可以对整型数组进行整体输入、输出C、利用字符型数组可以实现字符串操作D、不能通过赋值运算符“=”对字符型数组进行整体赋值8、下列程序的输出结果是?#include 例如: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\n", 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- -的意义,以及数组元素的下标法访问及指针运算符访问方法:例:int a[4]={1,2,3,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指针的函数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 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’呢? { p1++; p2++; }}代码段二:void MyStrcpy( char *p2, char *p1 ) { while (*p1 != '\0' ) { *p2=*p1 p1++; p2++; }}(3)结构体类型:会正确定义结构体类型,掌握三种变量定义的方式及变量的初始化方式,理解结构体变量内存占用的情况(各成分依次存放,故结构体变量所占空间至少为所有成员需要的空间之和),会正确访问结构体变量的成员(用点运算符或是箭头运算符),结合结构体数组及指针会正确访问结构体的元素。 练习:1、定义struct Point{ int x,y; }pos[ ]={{1,2},{3,4},{5,6}}, *pt=pos;则表达式(++pt)->y的值为______ , ++(pt->x) 的值为_________, ++pt->x 的值为______、(*pt).y的值为_____2、以下对结构体变量stu中成员的非法引用是______struct Point{ int x; int y;} pos, *p=&pos;A、pos.x B、(*p).y C、p->x D、Point.y作为函数参数,通常定义结构体的指针作为形式参数,将实参结构体变量的地址传入,这样省时效率高,而且可在被调函数中修改对应实参结构体成员的值练习:下列程序的运行结果是?#include 练习:1、设以下程序的所有的指针均为上面struct node*变量,已知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) { q=p->next; delete p; }下面的代码的功能是___?p=(struct node*)malloc(sizeof(struct node));p->data=x;p->next=head;head=p;2、链表中的结点的形成可以有。
