南邮高级语言程序设计期末总复习模块四数据类型Word格式文档下载.docx
《南邮高级语言程序设计期末总复习模块四数据类型Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《南邮高级语言程序设计期末总复习模块四数据类型Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
#include<
stdio.h>
voidmain()
{
inta[100],num=0,i=0;
do
scanf(%d,&
a[i++]);
}while(a[i-1]!
=-1);
num=i-1;
for(i=0;
i<
num;
i++)
printf(],a[i]);
printf(\
%d\n,num);
}
练习:
1、有数组定义inta[m][n],则在a[i][j]之前的元素的个数为______。
2、以下一维数组的定义正确的是___
A、intn=3,a[n];
B、#defineN=3inta[N];
C、constintn=3;
inta[n];
D、#defineN3inta[N*3];
____
、以下一维数组定义及初始化正确的是3.
A、inta[];
B、inta[]={1,2,3}
C、inta[3]={1,2,3,4}D、inta[3]={,2,}
4、以下选择中,能正确定义二维数组的是______。
A、intx[][2];
B、intx[][2]={2*2};
C、intx[2][]={1,2,3,4};
D、inta[2][3]={,{1}};
5、若定义inta[10]={9,1,15,6,2,11,8,7,19,3};
则m[m[1]+2*m[4]]的值是______,*m+m[8]的值为______。
6、下列字符数组定义与初始化不正确的是____
A、chars[]=”abc”;
B、chars[]={”abc”};
C、chars[3]={‘a'
'
b'
c'
};
D、chars[3]=”abc”;
7、下列关于数组的描述中不正确的是______。
A、可以对字符型数组进行整体输入、输出
B、可以对整型数组进行整体输入、输出
C、利用字符型数组可以实现字符串操作
D、不能通过赋值运算符“=”对字符型数组进行整体赋值
8、下列程序的输出结果是?
#include<
intf(int*a,intnum,intx);
voidmain()
{inta[10]={8,6,17,29,34,5,7,23,2,1};
intpos;
pos=f(a,10,7);
printf(%d,pos+1);
intf(int*a,intnum,intx)
{inti;
for(i=0;
i<
n;
i++)
if(x==a[i])returni;
return-1;
)P239教材的6.3程序填空题,需要认真理解。
其中的(3如果改为统计某一个字母出现的次数,可以作怎样的简化?
int*p;
例:
指针类型:
(2)定义形式为:
数据类型*指针变量名,操作,若注意p的区别。
指针变量若未赋值,不能对*p与*p操作。
对指针赋值为空值,也不能对*p例如:
都不正确scanf(%d,f)int*f=NULL;
、1或*f=10.5;
*f=&
t都不正确f=t*f=tf=&
t2、intt='
A'
*f;
或均正确;
,、3正确int*f;
f=NULL;
练习:
输出为printf(%s\n,c+3)____则已知1、:
char*s=student;
赋值功能的语、若有说明:
2inta,b=9,*p=&
a;
,则能完成a=b____
句是*p=&
*b;
C*p=*&
b;
Ba=*p;
、A、、D、a=&
理解数组对指针操作一维数组要熟练掌握,:
指针与数组的关系
名是地址常量的概念,指针指向数组的时候执行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个整型元素的一维数组,与二维数组一起使用,用于获得行指针值,例inta[2][3];
p=a;
int*p[3];
//含3个整型指针元素的一维指针数组p
int(*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;
二维数组中元素的表示:
inta[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”;
都是正确的
charp[4]=“ABC”;
正确,但是charp[4];
p=”ABC”;
却错误
s=p;
是正确的赋值,但是s=*p,*s=”AB”都是错误的
下面的函数代码是否都能正确实现字符串的拷贝(将p1串拷贝到p2串中?
)
代码段一:
voidMyStrcpy(char*p2,char*p1){
while((*p2=*p1)!
='
\0'
)//此处换成......!
='
\n'
呢?
{
p1++;
p2++;
}}代码段二:
while(*p1!
){*p2=*p1
}
(3)结构体类型:
会正确定义结构体类型,掌握三种变量定义的方式及变量的初始化方式,理解结构体变量内存占用的情况(各成分依次存放,故结构体变量所占空间至少为所有成员需要用点运算符或是,会正确访问结构体变量的成员(的空间之和).
下笔如有神读书破万卷
,箭头运算符)结合结构体数组及指针会正确访问结构体的元素。
6}},*pt=pos;
1、定义则表达式(++pt)->
y的值为______,++(pt->
x)的值为_________,++pt->
x的值为______、(*pt).y的值为_____。
2、以下对结构体变量stu中成员的非法引用是______。
structPoint
intx;
inty;
}pos,*p=&
pos;
A、pos.xB、(*p).yC、p->
xD、Point.y
作为函数参数通常定义结构体的指针作为形式参数,将实参结,构体变量的地址传入,这样省时效率高,而且可在被调函数中修改对应实参结构体成员的值
下列程序的运行结果是?
typedefstructStudent
{charname[10];
doublescore;
}STU;
voidf(STU*s)
{(*s).score*=20;
printf(%s%.1f\n,s->
name,(*s).score);
{STUstu[]={{LiuBo,4.5},{JiWei,4.6},{Lijie,5.0}};
f(stu+1);
printf(%s%.1f\n,stu->
name,(*stu).score);
利用结构体和指针的递归定义可以实现单链表
structnode{
intdata;
structnode*next;
}*head;
在单链表中,最重要的是头指针的信息,头指针用于指向单链表的第一个结点处,顺着链依次寻找其它的结点,单链表不可随机访问其中的结点,最后一个结点的指针域置为空
理解单链表的遍历、插入一个结点、删除一个结点等方法。
1、设以下程序的所有的指针均为上面structnode*变量,已知head为头指针,指针p指向了单链表中的某一个结点处,但肯指向了某一个结q指针定不是指向第一个结点和最后一个结点,
点处,该结点不在链表中,下面的代码实现的功能是___?
(方法提示:
根据描述先画出单链表示意图来)
p=p->
next;
s->
next=p->
p->
next=s;
如果p指向的是链表中倒数第二个结点处,则上面代码实现的功能为______,这时代码还可以写成______?
下面的代码的功能是___?
p->
next=p->
next->
deletep->
for(p=head;
p;
p=q){q=p->
deletep;
p=(structnode*)malloc(sizeof(structnode));
data=x;
next=he