c语言练习题7(指针与结构体,有答案)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、下列程序的运行结果是_B______。
void fun(int *a,int *b)
{
int *k:
k=a;a-b;b=k;
}
main()
{
int a=3,b=6,*x=&a,*y=&b;
fun(x,y);
printf[”%d%d.f,a,b);
}
A)6 3 B)36 C)编译出错 D)0 0
PS:本题中主函数里的x、y,fun函数里的a、b、k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。
2、若有定义:int*p[3];,则以下叙述中正确的是____B____。
A)定义了一个基类型为int的指针变量p,该变量有三个指针
B)定义了一个指针数组p,该数组含有三个元素,每个元素都是基类型为int的指针
C)定义了一个名为+p的整型数组,该数组含有三个int类型元素
D)定义了一个可指向一维数组的指针变量p,所指一维数组应具有三个int类型元素
PS:由于运算符[]优先级比*高,int*p[3];相当于int *(p[3]);表示数组p 的三个元素都是指针变量,且每个元素都是基类型为int的指针。
3、有以下程序:
void swapl(int *a,int *b)
{int *c=a;
a=b,b=c;
}
void swap2(int *a,int *b)
{
int c=*a:
*a=*b,*b=c;
}
main()
(int a=lO,b=15;
swapl(&a,&b);
printf(”%d,%d,”,a,b);
a=lO,b=15;
swap2(&a,&b);
printf(”%d,%dt.,a,b);
}
其输出结果为_10,15,15,10___。
A)15,10,10,15 B)15,10,15,10 C)10,15,10,15 D)10,15,15,10
PS:C语言规定,实参变量对形参变量的数据传递是“值传递”,只由实参传给形参,而不能由形参传回来给实参。在内函数调用结束后,形参单元被释放,实参单元仍保留并维持原值。本题中swapl()函数中,虽然改变了形参指针的值,但实参指针的值并没有改变,所以执行第一个printf后应输出10,15,;swap2()函数实现了交换两个变量a和b的值,因此执行第二个printf后输出交换后的值15,10,所以本题答案为D。
4、当调用函数时,实参是一个数组名,则向函数传送的是___B_______。
A)数组的长度B)数组的首地址
C)数组每一个元素的地址 D)数组每个元素中的值
PS:当调用函数时,实参是一个数组名,则向函数传送的是数组的首地址,函数中的形参可定义成以下三种形式:
①形参定义成数组;
②形参定义成可变长数组;
③形参定义为指针变量。
5、设有以下声明语句
struct ex
{ int x;float y;char z;}example;
则下面的叙述中不正确的是_____B_____。
A)struct是结构体类型的关键字B)example是结构体类型名
C)x,y,z都是结构体成员名 D)struct ex是结构体类型
6、以下只有在使用时才为该类型变量分配内存的存储类说明是____B____。
A)auto和stmic B)auto和register
C)register和static D)extem和register
PS:extem、register、static、auto分别是定义外部变量、寄存器变量、静态变量、自动变量,其中,自动变量和寄存器变量属于动态存储,调用时临时分配单元;而静态变量和外部变量属于静态存储,在整个程序运行时都存在。
7、下面程序运行后的输出结果是__C________。
fut(int**s,int p[2][3])
{
**s=p[l][1];
}
main()
{
int a[2][3]={1,3,5,7,9,1l},*p;
p=(int*)malloc(sizeof(int));
fut(&p,a);
printf(”%d\n”,*p);
}
A)l B)7 C)9 D)ll
PS:本题a[2][3]定义为一个具有两行三列的元素的数组,malloc()函数的作用是开辟了一个长度为sizeof(int)的内存区,p为指向整型数据的指针变量,程序调用fur()函数,将第一行第一列对应的元素值赋给一s,由于数组中第一行第一列对应的元素为9,所以本题输出值9。
8、以下程序的输出结果是10 。
main()
{
int arr[]={30,25,20,15,10,5},*p=arr;
p++;
printf(”%d\n”,*(p+3));
)
PS:整型指针最初被赋的值是数组art的头指针,即指向数组的第一个元素30,p++后,指针指向数组的下一个元素,即*p=arr[1]=25,在执行*(p+3)时,则相当于a[1+3],即10。因此,输出应为10。
9、下列程序的输出结果是6。
main()
{
int a[]={2,4,6},*ptr=&a[0],x=8,y,z;
for(y=O;y<3;y++)
z=(*(ptr+y) printf(”%d\n”,z); 10、若有定义语句:char s[100],d[100];int j=0,i=0;且s中已赋字符串,请填空以实现拷贝。(注:不使用逗号表达式) ;} d[j]=0; PS:本题中为了能实现字符串的拷贝,需要使字符数组s从头到尾依次遍历其所有元素。本题应使用i的自增后置来实现。 11、若有如下结构体说明: struct STRU { int a,b;char c:double d: struct STRU *pl,*p2; }; 请填空,以完成对t数组的定义,t数组的每个元素为该结构体类型。 struct STRU t[20] 12、_数据库______ 是数据库应用的核心。 13、对指定字符串中的字符串进行从大到小排序.