选择
1
若有以下说明和语句
int c[4][5],(p)[5];
p=C;
能够正确引用c数组元素的是
A、
p+ 1
B、(p+3)
C、*(p+1)+3
D、
*(p[0]+2) .
题意分析
1.声明了一个二维数组 c,其中有四个一维数组,每个一维数组包含五个整数。
2.在C语言中,(*p)[5] 表示一个指向数组的指针,该数组有5个元素。这个表达式通常被用于指向一个二维数组的指针。
具体来说,这个表达式可以解释为:
p 是一个指针,它指向一个数组。
(*p) 解引用指针 p,获取该指针指向的数组。
(*p)[5] 获取该数组的第6个元素,因为数组是从0开始编号的。
因此,如果一个二维数组 arr 定义为 int arr[3][5],那么可以使用指向该数组的指针 int (*p)[5],通过 (*p)[5] 来访问该数组的第6个元素。
(进行了两部操作,定义指针变量和获取数组中的元素)
选项分析
A、p+1 表示将指针 p 后移一个一维数组,即 &c[1],但是这并不能直接引用数组元素,所以选项 A 是错误的。
B、(p+3) 表示将指针 p 后移三个一维数组,即 &c[3],然后对该指针解引用取值,即可以得到第四个一维数组 c[3],所以这个选项是错误的。
C、(p+1)+3 表示将指针 p 后移一个一维数组,然后对该指针解引用取值,即可以得到第二个一维数组 c[1],然后再将该指针指向的一维数组的第四个整数的指针返回,即 &c[1][3],但是这并不是直接引用数组元素,所以选项 C 是错误的。
D、*(p[0]+2) 表示先将 p[0] 指向二维数组 c 的第一个一维数组 c[0],然后对该一维数组的第三个整数的指针返回,即 &c[0][2],这个操作是直接引用数组元素,所以这个选项是正确的。
因此,选项 D 是正确的。
2
有以下程序.
int a=2; int f(int*a) {return(*a) ++;}
main()
{ int s=0;
{ int a=5;
s+=f(&a) ;
}
s+=f(&a) ;
pfintf(“%d\n”,a) ;
}
执行后输出结果是
A、
10
B、9
C、7
D、8
解析
若在函数中定义了与全局变量名字相同局部变量,则全局变量在该函数中将不起作用。本题中定义了一个全局变量a和局部变量a。在主函数中定义一个整型变量s并赋初值为0,接着定义了一个局部变量a并赋值为5,由于该局部变量的和全局变量a同名,故全局变量在复合语句中将不起作用,然后调用函数f(&a) (该函数的作用是返回存储变量a的空间中的值,并让该值加1,分析程序可知返回值为5,并让a值加 1变为6),并将返回值加到s中。此时s的值为5,然后执行该复合语句外的其他语句,同样调用函数f(&a) ,但传递的参数是全局变量a,故其返回值为2,加到s中后s的值变为 7,故最后输出的s的值为7。C
3
有以下程序.
main()
{ int x[8]={8,7,6,5,0,0}, *s;
s=x+3;
printf(“%d\n” ,s[2]);
}
执行后输出结果是
A、随机值
B、0
C、5
D、6
解析
本题通过赋值语句s=x+3,使指针变量s指向数组元素x[3],输出语句中的s[2]等价于*(s+2),即x[5]的值0。所以, B选项为所选。
4
下列程序的运行结果是
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” ,a,b);
A、6 3
B、3 6
C、 编译出错
D、0 0
解析
本题中主函数里的x、y,fun函数里的a\b\k,这些都是指针,fun函数中只是将a、b这两个指针交换了位置,而并没有改变主函数中变量a、b的值。B
5
若定义: int a=511,*b=&a;,则printf(“%d\n”,*b);的输出结果是
A、无确定值
B、a的地址
C、512
D、
511
解析
本题考核的知识点是 printf()函数的输出格式.本题中先定义了一个int型的变量a并赋初值为511,接着定义了一个指向a的指针变量b,在printf()函数的输出格式中,是输出 *b,即输出指针所指向变量a的值为511,因此输出 511。所以,4个选项中D为所选。
6
以下选项中,能定义s为合法的结构体变量的是
A、typedef struct abc
{
double
a;
char b[10];
B、struct
{ double a;
char b[10];
}S;
C、struct
ABC
{ double
a;
char b[10];
}
ABC
S;
D、typedef ABC
{double a;
char b[10];
ABC S;
本题的考查点是结构体变量的定义。定义一个结构体类型的变量,可采用3种方法:
①struct 结构体名 变量名列表
例如:struct student s1,s2;
②定义结构体的时候就定义结构体类型变量,变量位置位于 } 之后, ;之前,多个变量之间用 , 隔开。
struct 结构体名
{
//成员列表
} 变量名列表;
例如:
struct student //定义一个结构体类型
{
int num; //学号
char name[100]; //姓名
int sex; //性别:0 女 , 1 男
int age; //年龄
char address[100]; //地址
} s1,s2;
③直接定义结构类型变量,连结构体名都省略了
一般形式:
struct
{
成员列表;
}变量名列表;
B
7
下面各语句行中,能正确进行赋字符串操作的语句行是
A、char st[4][5]={" ABCDE"};
B、char s[5]={‘A’,‘B’,'C;‘D’,‘E’};
C、char *s; s=“ABCDE”;
D、char *s; scanf( “%S”,S);
A 选项中,st 是一个二维字符数组,其中包含四个字符串,每个字符串长度为 5。但是,字符串前有一个空格作为第一个字符,因此其长度为 6,数组应声明为 char st[4][6]。
B 选项中,使用大括号初始化字符数组时应以逗号分隔每个字符,但是在第三个字符’C’ 后面使用了分号而非逗号,会导致编译错误。
D p是一个野指针,不能直接往p指向的内存空间中输入数据
C
8
以下数组定义中错误的是_
A、int x[][3]={0};
B、int x[2][3]={{1,2},{3,4},{5,6}};
C、
int x[][3]={{1,2,3},{4,5,6}};
D、
int x[2][3]={1,2,3,4,5,6};
二维数组赋初值时,第一个维数,即行数可以省略,但是列数不能省略。
选项A, C正确。选项D是按数据在二维数组中的顺序初始化。在选项B中,行维数的初始化格式跟定义的维数不一致,为错误选项。B
x[2][3]
n[行][列]
下标 0 1 2
0
1
9
本题题面要求删除q所指结点并释放该结点,而选项A中虽然是删除了q所指节点,但并未释放q这个结点,而释放的是p结点,所以选项A错误;选项B是将q的下一结点的地址赋值给指针变量p,这意味着p原来的成员变量内容被q的下一结点的成员变量内容所代替,即原p结点也被删除了,所以选项B错误;选项C相当于将q的所有成员变量内容代替了p的所有成员变量内容,即p结点被删除,所以错误;选项D是将q的下―结点的地址赋值给p的成员next (成员next用于存放一结点的地址),使得p的next成员不再指向q,而是指向q的下一结点,相当于删除了q这个结点,同叫用free函数正确释放了q这一结点,所以选项D正确。
10
下列关于C语言文件的叙述中正确的是
A、文件由一系列数据依次排列组成,只能构成二进制文件
B、文件由结构序列组成,可以构成二进制文件或文本文件
C、文件由数据序列组成,可以构成二进制文件或文本文件
D、文件由字符序列组成,其类型只能是文本文件
在C语言中,文件是通过文件指针来引用的。文件可以以二进制文件或文本文件的形式存在。二进制文件中,数据以原始二进制形式存储,而文本文件中,数据以ASCII或Unicode字符编码的文本形式存储。因此,文件中的数据序列可以是任意类型的数据,而不仅仅是字符序列。
在C语言中,可以使用fopen()函数打开文件,并使用fread()和fwrite()函数读取和写入文件。读取和写入文件时,需要指定所读取的数据类型。例如,在读取一个int类型的数据时,需要使用fread()函数并指定读取的数据类型为int。同样,在写入一个int类型的数据时,需要使用fwrite()函数并指定写入的数据类型为int。
因此,选项C是正确的。
11
针对简单程序设计,以下叙述的实施步骤正确的是
A、确定算法和数据结构、编码、调试、整理文档
B、编码、确定算法和数据结构、调试、整理文档
C、
整理文档、确定算法和数据结构、编码、调试
D、确定算法和数据结构、调试、编码、整理文档
设计一个能解决实际问题的计算机程序需要经过以下几个过程:①建立模型;②算法设计:给出解 决问题的步骤,即算法;③算法表达:选择一种表达算法的工具,对算法进行清晰的表达;④编写程序:选择一 种程序设计语言,把以上算法程序化,这称为编写程序;⑤程序调试:对编写好的程序进行调试,修改程序中的 错误;⑥程序文档编写与程序维护。
A
12
程序中对fun函数有如下说明
void *fun();
此说明的含义是
A、fun函数无返回值
B、fun 函数的返回值可以是任意的数据类型
C、fun函数的返回值是无值型的指针类型
D、
指针fun指向一个函数,该函数无返回值
指针函数是指其返回值的类型为地址即指针类型。本题中定义了一个指针类型的函数。C
13
有以下程序#include <stdio.h>
main()
{FILE *fp1;
fp1 =fopen(“f1.txt”,“w”);
fprintf(fp1," abc");
fclose(fp1);
若文本文件f1.txt中原有内容为: good,则运行以下程序后文件f1.txt中的内容为_
A、goodabc
B、abcd
C、abc
D、abcgood
C语言处理文件的几种模式包括:
读模式(“r”)
使用读模式打开文件时,文件指针指向文件的开头,只允许读取文件内容,不能修改。如果文件不存在,则打开失败。
示例:FILE *fp = fopen(“file.txt”, “r”);
写模式(“w”)
使用写模式打开文件时,文件指针也指向文件的开头,但是,该模式会清空文件中的所有内容,并可以将内容写入文件。如果文件不存在,则创建新文件。
示例:FILE *fp = fopen(“file.txt”, “w”);
二进制读模式(“rb”)
使用二进制读模式打开文件时,可以读取任何类型的数据,例如图片、音频或视频等。该模式下打开的文件是以二进制形式读取的。
示例:FILE *fp = fopen(“file.jpg”, “rb”);
二进制写模式(“wb”)
使用二进制写模式打开文件时,可以向任何类型的文件写入二进制数据。
示例:FILE *fp = fopen(“file.bin”, “wb”);
读写模式(“r+”)
使用读写模式打开文件时可以读取和写入文件内容,但是文件指针指向文件开头,对文件的写入会覆盖原有的内容。
示例:FILE *fp = fopen(“file.txt”, “r+”);
追加模式(“a”)
使用追加模式打开文件时,文件指针指向文件结尾。对文件进行写入时,数据会被追加到文件末尾,不会影响文件中的原内容。
示例:FILE *fp = fopen(“file.txt”, “a”);
二进制读写模式(“rb+”)
使用二进制读写模式打开文件时,可以读取和写入任何类型的数据,文件指针指向文件开头,对文件的写入会覆盖原有的内容。
示例:FILE *fp = fopen(“file.bin”, “rb+”);
当用“w”打开时,已存在一个以该文件名命名的文件,则在打开时将该文件删除,再重新建立一个新文件,因此当输入时原来的内容已被覆盖,所以只有后输入的内容,故选择C选项。
14
所要做的工作就是,把F值所在的结点的next指向s结点,并且把s结点的next指向NULL;
所以,有以下方法:
1对应A选项
把s结点的next指向null即:s->next = ‘\0’;
把p指针指向F所在的结点,也就是p结点的next指针所指向的结点:p = p->next;
把F所在的结点的next指向s结点;
2对应B选项
p指针指向F所在的结点:p = p->next;
s结点的next指针指向p->next,也就是NULL:s->next = p->next;
把F所在的结点的next指向s结点;
3对应选项D
这个选项其实和B选项采用的方法是一样的,只不过取值的方式不一样,B选项用指针取值的,而B选项首先把指针的所指向的地址给拿出来,在对其取值,相当于普通变量。所以B选项用的是’->‘而D选项用的是’.’
C项中,最后面的两个结点都成为环,错误,故选C
15
有以下结构体说明、变量定义和赋值语句
struct STD
char name[10];
int age;
char sex;
}s[5],*ps;
ps= &s[0];
则以下scanf函数调用语句中错误弓引|用结构体变量成员的是
_。
A、scanf(“%s”,s[0].name);
B、scanf(“%d”,&s[0].age);
C、scanf(“%c” ,&(ps-> sex);
D、scanf(" %d",ps-> age);
要给结构体成员输入数据,在scanf语句中需要使用结构体成员的地址。函数scanf是C语言的标准输入函数,其作用是在终端设备上输入数据,而且要求输入项必须是某个存储地址。
选项A中是引用结构体数组s的第0个元素s[0]的name成员,name是包含10个元素的数组,数组名就表示数组的地址,也就代表s[0].name的地址,所以选项A是正确的。
选项B显然也是正确的
选项C是先用指针变量引用结构体的成员sex后取它的地址,也是正确的。
选项D用指针变量引用结构体的成员sex后没有再继续取其地址,所以是错误的。
D
16
若有以下的定义: int t[3][2];能正确表示t数组元素地址的表达式是_
A、&t[3][2]
B、t[3]
C、t[1]
D、*t[2]
数组t有3行和2列,因此其元素地址的范围为t[0][0]到t[2][1]。在本题的选项中,只有选项C、t[1]位于这个地址范围之外,其他选项都会访问t数组的越界元素。*t[2] 表示这个二维数组 t 的一个元素的值,因此,选项C是正确的
17
若fp是指向某文件的指针,且己读到文件末尾,则库函数feof(fp)的返回值是___。
A、Eof
B、-1
C、非零值
D、NULL
EOF是文本文件的文件结束标志,NULL是打开文件错误的时候返回值。foef(fp)用来判断文件位置指针是否在文件末尾,文本文件和二进制文件均可以使用此函数。如果遇到文件结束就返回1,否则返回非零值。
C
18
下列叙述中正确的是__。
A、每个C程序文件中都必须有一个main()函数
B、在C程序中main()函数的位置是固定的
C、C程序中所有函数之间都可以相互调用,与函数所在位置无关
D、在C程序的函数中不能定义另一个函数
A 有的程序可以没main函数,而是一个简单的命令语句.
B 在同一个程序中,可以将 main() 函数放置在任何位置
C 叙述不完全正确,虽然 C 程序中的函数可以相互调用,但是这些函数必须在调用之前声明或定义。如果没有提前声明或定义函数,则编译器将无法知道如何处理函数调用
D 函数的定义不能放在另一个函数体内
D
19
有以下程序#include < stdio.h>
int fun()
{ static int x=1;
x*=2;
return X;
main()
{ int i,s=1;
for(i=1;i<=3;i+ +) s*=fun();
printf("%d\n’ ,;S);
程序运行后的输出结果是
_o
A、0
B、10
C、30
D、64
静态局部变量x,在静态存储区内分配存储单元。在程序整个运行期间都不释放。所以第一次循环s的值为2;第二次循环中,返回的x的值为4,所以s的值为8;第三次循环中,返回的x的值为8,所以s的值为64,D
20
以下程序的输出结果是
main( )
{ int i;
for(i=1;i<6;i++)
{ if(i%2){printf(" #" );continue;}
printf(" * “);
printf(”\n");
}
A、# * # * #
B、 #####
i从i到5循环5次,i为1时,满足条件,打印输出“#”;i为2时,条件为假,打印输出“*”。也就是说,当i为奇数时,条件为真,程序打印输出“#”,否则,输出:“ * ”,A
判断
1
共用体变量所占的内存长度等于最长的成员的长度。
正确。共用体变量所占内存长度等于最长的成员的长度,因为共用体中的所有成员都共用同一块内存空间,以最长的成员为基准,确保其他成员也能够存储在其中。
2
rewind (fp) ;可使fp所指文件的位置返回到文件的开头。
正确。rewind(fp) 函数将文件指针 fp 所指的文件位置重置到文件开头,可以重新读取文件内容。
3
在定义结构体时,成员的类型必须指定,既可以是简单的数据类型,还可以是构造的数据类型。
正确。在定义结构体时,需要为每个成员指定类型,类型可以是简单的数据类型,也可以是结构体、共用体或枚举等构造的数据类型。
4
结构体数组中每个数组元素都是类型相同的结构体,可以对每个数组元素整体进行输入和输出的操作。
正确
5
链表的插入和删除和数组元素一样需要移动插入或删除点后的元素。
正确。在链表中,插入或删除一个结点后,该结点后的元素都需要移动,否则会导致链表出现断裂情况。
6
若指针变量指向一维数组的第一个元素,将指针变量加整数3,即指针后移3个元素。
正确。指针变量加整数n会向后移动n个元素的位置,因此若指针变量指向一维数组的第一个元素,加整数3即可将指针后移3个元素。
7
在C语言中,可以把一个结构体变量作为一个整体赋值给另一个具有相同类型的结构体变量。
正确。可以将一个结构体变量作为整体赋值给另一个具有相同类型的结构体变量,因为结构体变量中存储的所有成员都可以一次性赋值。
8
文件指针用于指向文件,文件只有被打开后才有对应的文件指针。
正确
9
如果函数定义出现在函数调用之前,可以不必加函数原型声明。
正确
10
文件的读函数是从输入文件中读取信息,并存放在内存中。
正确