一、 填空题:
1、 执行一下程序,while循环执行次数()(1分)。
int k = 0; while (!(k = 1)) { k++}
//没有进入循环,while的循环体之中将1赋值给给k,然后非k为假,没有进入循环。
2、 有定义:char p[] = {‘a’, ‘b’, ‘c’}, *q = p; 在下面找出一个不能计算出char型数据所占字节数的表达式是()(1分)。
sizeof(p) sizeof(char) sizeof(*q) sizeof(p[0])
//sizeof(p)打印的是数组的长度,不是char类型的长度。
3、 若定义:int a[9], *p = a; 不能表示a[1]地址表达式的是()(1分)。
p + 1 a + 1 a++ ++p
//a++,打印地址时,只打印一个首地址,之后再++,所以打印不了第二个地址。
4、 (2分)改错:从指定的字符串中删除指定的字符,同一字母的大小写按不同的字符处理。
void func(char p[], char c)
{
int i , j;
for (i=0; p[i]==’\0’; i++)
{
if (c != p[i])
{
p[j++] = p[i];
}
}
}
// j 没有初始化,for循环里面的终止条件也不对,应该是p[i] != ‘\0’,最后也没有给最后末尾没有结束标志,最后需要补上一个结束标志。
5、 (4分)在一个32位的计算机中,计算下面的值。
void main(void)
{
struct
{
char c;
int a;
char b;
}B;//结构体之中,有空间对齐的默认设置,所以,结构体的大小为12
char *s1 = “0123456789”;
char s2[] = “0123456789”;
char s3[100] = “0123456789”;
int s4[100];
char q1[] = “abc”;
char q2[] = “a\n”;
char *q3 = “a\n”;
int len1 = sizeof(s1); //4(指针大小)
int len2 = sizeof(s2); //11(有结束标志符)
int len3 = sizeof(s3); //100(数组大小)
int len4 = sizeof(s4); //100(数组大小)
int len5 = sizeof(q1); //4(结束标志)
int len6 = sizeof(q2); //3()
int len7 = sizeof(q3); //3
int len8= sizeof(B); //12
}
6、 (2分)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。写出下面程序的运算结果().
//结果为8,计算二进制9999中1的个数。
7、(4分)int a[5] = {1, 3, 5, 7, 9};
int *p1 = a + 1;
int p2 = (int )(&a + 2);
printf(“%d.\n”, *(p1+1));
printf(“%d.\n”, *p1++);
printf(“%d.\n”, ++(*p1));
printf(“%d.\n”, *(p2-8));
//(p1+1)为(a+2)
//*p1++将p1中的数读出来之后,之后指针加一。
//++(*p1)将p中的数读出来加一之后,打印
//p2在a的基础上增加两个数组的长度,再减去4*8个字节的单位。
8、(3分)(1)、func(char *a){} 解释:传递的是__的地址。
// char *a ,传的是实参的地址
(2)、func(char a[]){} 解释:传递的是__的地址。
//传递的是传进来的实参的字符串的首地址
(3)、func(char a[8]){} 解释:传递的是__的地址。
//传进来的是一个字符串数组,长度为8。
9、(3分)分别写出int,float,指针类型的变量a 与“零”的比较语句。
(1) int a =1 ; if(a != 0)
(2) float a = 1; if(a <0.000001 && a >-0.000001)
(3) int *a = NULL; if(a != NULL)
10、(2分)下面代码输出什么,为什么?
void func(void)
{
unsigned int a = 6;
char b = -20;
if (a + b > 6)
{
printf(“> 6.\n”);
}
else
{
printf(“< 6.\n”);
}
}
//字符类型与无符号整形的相加默认为无符号整形。所以一直大于0。所以打印 ‘>6’
11、(2分)int a = -9; 那么按位取反和按逻辑取反是多少。
//按位取反。原码:1000 0000 0000 0000 0000 0000 0000 1001
// 取反 0111 1111 1111 1111 1111 1111 1111 1111 0110
//按逻辑取反 原码:1000 0000 0000 0000 0000 0000 0000 1001
//取反 1111 1111 1111 1111 1111 1111 1111 0110
12、(2分)请说出const与#define 相比,有何优点?
//const 常量,使用起来比#define方便,不容易出错。
#define是替换,非常容易出错,对于程序来说,容易造成未知的错误。
13、(2分)简述数组与指针的区别?
数组是统一数据类型的集合。
指针是指向(保存)某一数据类型地址的中介。
14、(2分)What will be printed as the result of the operation below:
main()
{
char *ptr = ” Cisco Systems”;
*ptr++;
printf(“%s\n”,ptr);
ptr++;
printf(“%s\n”,ptr);
}
写出输出结果:_
Cisco Systems
isco Systems//前面有空格。
15、(2分)101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
//第一步:把硬币分为三堆儿(50,50,1),先拿两个50 放天平比较,如果相等,说明那个单个的就是假的,再随便拿一个真硬币和这个假硬币放天平比较一下就可得到结果。
第二步:如果第一步的两个50 比较后不相等,此时一端50重,一端50轻。如果拿轻的一端50,分成两堆(25,25) 放到天平上,如果这两个25相等,则假硬币(重)在重的一端50里,否则(不相等)假硬币(轻)在这两个(25,25)里,也就是轻的一端50里。
16、(2分)完成字符串拷贝可以使用strcpy 及 memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?
//strcpy是纯粹于字符串的复制
memcpy不仅可以复制字符串,什么都能复制,使用起来麻烦些
17、(5分)请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf("%d\n", sizeof(a));//a数组的大小。
printf("%d\n", sizeof(b));//b的地址。
printf("%d\n", sizeof(a[3]));//地址存放的字符。
printf("%d\n", sizeof(b+3));//地址。
printf("%d\n", sizeof(*(b+4)));//地址存放的字符。
return 0 ;
}
//30,4,1,4,1, sizeof计算占用内从空间的大小,以字节为单位。
18、(2分)字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
19、(1分)int a[3];
a[0]=0;
a[1]=1;
a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则a[q-p]=?
// p指向0,q指向2。所以我们最后的结果为2。
20、(4分)int array[10],不能对数组执行array++语句,原因是()。该数组的数组名array代表的含义是(),&array代表的含义是(),数组名不能作为左值的原因:()。
//array++代表加整个数组的长度。所以执行后,再想使用数组的话就是会出现越界的错误。。array代表数组的首地址,首元素。&array代表取数组的首地址。数组名作为左值时为一个常数(申请数组时已经分配好地址空间),所以最后不能重新赋值。
21、(2分)下面程序段的运行结果是 。
char *s=”abcde” ;
s+=2 ; printf(“%d”,s);
//最后结果为:未知。s的地址每次都不相同。所以每次都不相同。
22、(1分)一个栈的入栈序列是abcde,则栈的不可能输出序列是:__。
A. edcba B. decba C. dceab D. abcde
//c是错误的因为c不可能先比e出栈。
23、(20分)根据下面给出的声明和数据,对每个表达式进行求值并写出他的值。在每个表达式进行求值是使用原来给出的值(也就是说,某个表达式的结果不影响后面的表达式)。假定ints数组在内存中的起始位置是0x40000100,整型值和指针的长度都是4字节。
int ints[20]={10, 20, 30, 40, 50, 60, 70, 80, 90, 100,110, 120, 130, 140, 150, 160, 170, 180, 190, 200
};
(Other declarations)
int *ip=ints+3;
表达式 值 表达式 值
ints 10 ip 0x4000010C
ints[4] 50 ip[4] 80
ints+4 0x40000120 ip+4 0x4000012
*ints+4 54 *ip+4 44
(ints+4) 50 (ip+4) 80
ints[-2] 随机值 ip[-2] 20
&ints 0x40000100 &ip 0x40000110
&ints[4] 0x40000120 &ip[4] 80
&ints+4 0x40000120 &ip+4 0x40000132
&ints[-2] 0x400000f8 &ip[-2] 0x40000108
24、(1分)
int a[3][2] = {(1,2),(3,4),(5,6)};
int *p = a[0];
printf(“%d\n”,p[0]);
return 0;
输出结果:__
//结果为2,逗号表达式取最后面的逗号的值。
25、(2分)
下题中调用GetMemory()能否使str获得期望的内存,为什么?
Void GetMemory(char *p, int num)
{
p = (char )malloc(sizeof(char) num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, “hello”);
printf(“%s\n”,str);
}
//未知的值,返回的值不一定。
26、(3分)已知有以下定义:
char str1[] = “abcd”;
char str2[] = “abcd”;
const char str3[] = “abcd”;
const char str4[] = “abcd”;
const char *str5 = “abcd”;
const char *str6 = “abcd;
char *str7 = “abcd”;
char *str8 = “abcd”;
判断下列表达式是否相等?
str1 == str2 ? //数组首地址不同
str3 == str4 ? //数组首地址不同
str5 == str6 ?//指针数组,公用一个首地址,相同。
27、(2分)以下两段程序输出分别是什么,为什么?
#include <stdio.h>
char *returnStr()
{
char p[]="hello world!";
return p;
}
int main()
{
char *str=NULL;
str=returnStr();
printf("%s\n", str);
return 0;
}
//啥都不打印,函数被释放后,找不到原先的字符串。最后打印换行。
28、(2分)这段程序运行的结果是()
int main()
{
const int N = 10;
const int M = 2;
int *a = new int[N];
for (int i=0; i
#include <stdio.h>
void func1(char *a)
{
*a = *a + 1;//指针指向a的值后,加一
}
int main(void)
{
char a = 0;
func1(&a);//传a的地址。
printf("a = %d.\n", a);
return 0;
}
2、(4分)请完成以下题目。
a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数。
b) 请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。//返回下标,
a)
#include <stdio.h>
int main(void)
{
unsigned int a = 0xf;(1到f的数值)
unsigned int b = 0x1;
int cnt = 0;
while (a)
{
if (a & flag)
{
cnt++;
}
//num向右移一位
a >>= 1;
}
return 0;
}
b)
int search(char *str,int n,char ch)
{
int i;
for(i=0;i
//第一个月入职一个员工(只有入职的一个员工),新员工入职三个月后便会招新员工进入。问n个月后的员工数目
#include <stdio.h>
int main(void)
{
int i = 0, j = 0, k = 0, l = 0;
int m = 0, n = 0, c = 0, z = 0;
scanf("%d", &n);
for(i=1; i<=n; i++)
{
if(i == 1 || i == 2|| i ==3)//前三个月员工数目为1
{
j = 1;
k = 1;
l = 1;
}
else
{
c = l + j;//保存最新一个月的职工数目
j = k;
k = l;//保存上两个月的职工数目
l = c;
}
}
printf("%d\n", c);
return 0;
}