-
渥瑞达北美
IT
培训
一、
简答题。
(
共
14
题
,
共
0
分
,
p>
每题
0
分
)
1.
int
i=10,
j=10,
k=3;
k*=i+j;
k
最后的值是
?
答:
k = 60
ok
2.
写出程序结果
:
void
Func(char
str[100])
{
p>
printf(
sizeof(str));
}
答:
4
或者
8
(如果操作系统为
32
位则为
4,64
位则
为
8
)
是地址吗
3.
写出
sizeof(struct
name2)
的结果
struct
name2{
char str;
int num;
short x;
}
不会!看结构
答:此题考察结构对齐的知识,结果为
12
4.
写出
sizeof(struct name1)
的结果
struct name1{
char str;
short x;
int
num;
}
不会!
答:同样考察的是结构对齐的知识,结果为
8
5.
A.c
和
B.c
两个
c
文件中使用了两个相
同名字的
static
变量
,
编译的时候会
不会有问题
?
这两个
static
变量会保存到哪里(栈还是堆或者其他
的)
?
答:
没有问题,
static
变量只在当前文件中有效,也就是说
stat
ic
变量的作用
域属于所在的文件域。
渥瑞达北美
IT
培训
static
变量保存在全局
/
静态区
6.
(void *)ptr
和
(*(void**))ptr<
/p>
的结果是否相同?
答:相同。首先第一个(
void
*
)
ptr
将
ptr
转换为空指针类型
(
一级指针
)
,
(
*
(
void**
))
ptr
相当于先将
ptr
转换为空类型指针(二级指针)。二级指针是
指向指针的指针,在前面加上<
/p>
*
(解指针),也就是空类型指针了(一级指针)。
7.
#define DOUBLE(x)
x+x
,
i =
5*DOUBLE(5)
;
i
是多少?
答
: i = 5 * 5+5 =
30;
看书上的结构理解下意思
8.
下面的声明都是什么意思?
const int a;
int
const a;
const int
*a;
int * const
a;
int const * const a
;
<
/p>
答:第一个定义常量
a
,第二个也是定义
常量
a
,第三个定义常量指针
a
,第四
个定义指针常量
a
,
第五个定义指向常量的指针常量(相当于
const
p>
引用)
。
9.
关键字
const
是什么含意?
答:
修饰基本类型,比如
int
类型为常量。
修饰指针分为两种情况:指针常量或者常量指针。
<
/p>
修饰类的成员函数,
则在此函数中无法修改类中数据成员的值。<
/p>
???
修饰返回值意味着返回值不可被改变
修饰函数参数,意味着函数参数不能被有意或者无意修改。
p>
10.
do……while
和
while……do
有什么区别?
< br>答:do…while
先执行循环再判断条件,while…do
先进行判断再执行循环。
11.
语句
for(
;
1
;
)
有什么问题?它是什么意思?
他的意思是循环条件永远为真,
不停地进行循环操作,
除非循环体中有强制退出
循环的语句才
能终止循环,其实功能就相当于
while(1)
渥瑞达北美
IT
培训
答:无限循环
12.
如何引用一个已经定义过的全局变量?
答:
题目
说的有点不太清楚,如果是引用其它文件中定义的全局变量用
extern
,
如果是在本文件中引用的话用作用域运算符
::
是在
c++
中的
()
结构中条件表达式的类型可
以是什么类型?
答:整型,字符型,常量,
枚举类型
14..h
头文件中的
ifndef/define/endif
的作用
?
答:预编译命令,一般是用来防止头文件多重包含
结构?
二、
问答题。
(
共
63
题
,
共
0
分
,
p>
每题
0
分
) <
/p>
1.
关键字
static
的作用是什么?
第一:隐藏。
static
全局变量只在本文
件中可访问,其它文件无法访问。
第二:持久保存变量的内容
。
static
变量一经初始化便到程序运行结束后才
会被释放。
第三:
默认初始化为
变量会被编译器默认初始化为
0
2.
int
a[3];
a[0]=0; a[1]=1;
a[2]=2;
int *p,
*q;
p=a;
q=&a[2];
则
a[q-p]=a[2]
这段程序执行完之后数组中元素的值分别是什么?
q-p=2
答:
0
,
1
,
2
渥瑞达北美
IT
培训
p>
3.
根据
a
的值,
完成
b
的初始化,并将
b
的值返回
int
func(
float
a)
{
int
b;
switch(a)
{
case 1: 30;
break;
case 2:
20;
case 3: 16;
default: 0
}
return b;
}
此程序段有什么错误,如果有请指出
答:<
/p>
只能用整型或者字符型或者枚举类型,
f
loat
类型不正确。
后面没有加
break
4.
写出程序运行结果
int
sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int
I;
渥瑞达北美
IT
培训
int
a=2;
for(I=0;I<5;I++)
{
printf(
}
}
p>
答:
8
,
10
p>
,
12
,
14
p>
,
16
5.
写出输出结果
void
g(int**);
int
main()
{
int line[10],i;
int *p=line;
for
(i=0;i<10;i++)
{
*p=i;
g(&p);
}
for(i=0;i<10;i++)
printf(
return
0;
}
void g(int**p)
{
(**p)++;
(*p)++;
}
答:
1 2 3 4 5 6 7
8 9 10
渥瑞达北美
IT
培训
6.
写出输出结果
int
main()
{
int
a[5]={1,2,3,4,5};
int *ptr=(int
*)(&a+1);//
解释
解释
1
printf(
}
答:
2
,
5
7.
写出下面的结果
char str1[] =
char str2[] =
const char str3[] =
const char str4[] =
const char
*str5 =
const char *str6 =
char *str7 =
char *str8 =
printf (“%d”,str1 == str2
);
//
数组名就是
printf (“%d”, str3 == str4);
printf (“%d”, str5 == str6
);
printf (“%d”, str7 ==
str8 );
答:
0 0 1 1
8.
以下
3
个有什么区别
?
char * const p;
char const * p
;
const char *p
;
渥瑞达北美
IT
培训
答:第一个是指针常量,第二个是常量指针,第三个也是常量
指针
9.
unsigned short
array[]={1,2,3,4,5,6,7};
int
i=3;
*(array+i)=?
答:
4
10.
i
最后等于多少
?
int i = 1;
int j
= i++;
if((i>j++) && (i++ ==
j)) i+=j;
答:
5
11.
写一个“标准”宏
1>
输入两个参数,输出较小的一个
2>
表明
1
年
中有多少秒(忽略闰年问题)
答:
此题的考察点是防止数据太大
int
类型表示不了,现在不用担
心(
int
占
4
个字节)
1.#define Min(a, b)
((a) <= (b) ? (a): (b))
2.#define
SECONDS_PER_YEAR (60 * 60 * 24 * 365UL
考察内容:
1). #define
语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2).
意识到这个表达式将使一个
1
6
位机的整型数溢出
-
因此要用到长整
型符号
L,
告诉编译器这个常数是的长整型数。
3).
如果你在你的表达式中用到
UL
(表示无符号长整型),那么你有了一个好
的起点
。
渥瑞达北美
IT
培训
12.
什么是预编译
,
何时需要预编译
?
答:预编译又称为预处理,主要做一些
文本的替换工作。比如
#include
包含文
件代码,
#define
宏定义的替换,条件编译等等
。
预编译代码有助于在开发周期中缩短编译时间,特别是在以
下的情况中:
1.
总是使用不经常改动的大型代码体
2.
程序由多个模块组成,所有模块都使用一组标准的包含文件
和相同的编译选
项。在这种情况下可以将所有包含文件编译为一个预编译头。
用于创建预编译头文件的第一次编译所花费的
时间比后面的编译稍长一些,通
过包含预编译代码可以加快后面的编译速度。
13.
阐述堆和栈的区别
答:
1.
申请方式。栈由编译器自动申请空间,堆需要
程序员手动申请空间。
2.
申请后的
系统响应。栈的剩余空间大于所申请的空间,系统为程序提供内存,
否则退出。堆申请方
式是链表式申请,遍历空闲内存链表,找到大于申请空间
的内存,从空闲内存链表中删除
,分配给程序。
3.
申请大小的限制
。栈在
windows
下是向低地址扩展的数据结构,是一块连
续
的内存区域,大小是固定的。(一般是
2m
< br>)堆是向高地址扩展的数据结构,是
不连续的内存区域。
4.
申请效率,栈分配速度较快,堆分配速度较慢,容易产生内存碎片。
还有其它的一些区别,课下大家自己去学习一下。
14.
简要描述
c
< br>程序的内存分配
答:
C
语言内存分配主要分为
< br>5
块
1.
栈。存放局部变量,函数参数等
。由编译器自动申请空间,自动释放。
2.
堆。由程序员手动申请、释放空间。
3.
常量存储区。一般是常量字符串
4.
静态
/
全局区。存储的是静态变量或者全局变量。初始化后等到程序结束后
内存才会被释放
5.
程序代码区。存放函数体的二进制代码。
渥瑞达北美
IT
培训
15.
static
全局变量与普通
的全局变量有什么区别?
static
局部变量和普通局
部变量有什么区别?
static
函数与普通
函数有什么区别?
答:
全局变
量只能在本文件中访问,
而全局变量可以通过
extern
p>
在其
它文件中访问
局部变量存储在全局
/
静态区中,<
/p>
一经初始化直到程序结束后才会被释
放。普通的局部变量存储在栈
中。
函数只能在本文件中访问,普通
函数可以在其它文件中访问。
16.
局部变量能否和全局变量重名,如果可以,请说明原因?
答:可以。局部变量会屏蔽全局变量
17.
使用枚举的好处?
答:代码的可读性就好一些
18.
全局变量和局部变量在内存中的存储是否有区别?如果有,是什么区别?
答:全局变量存储在全局数据区,
初始化后直到程序运行结束后才会释放内存。
局部变量存储在栈上,作用域在其被定义的函数或者块中,出了这个作用域就
会
被释放。
19.
#include
与
#include
的区别?
答:
<>
一般用来引用系统定义的头文
件,“”一般用来引用自定义头文件。
渥瑞达北美
IT
培训
20.
“引用”与指针的区别是什么?
答:引用是变量的别名,指针保存的是变量的地址。也就是说
引用是直接操作
变量本身,而指针是间接操作变量。
21.
已知
strcpy
函数的原型是:
char * strcpy(char * strDest,const char
* strSrc);
1.
不调用库函数,实现
strcpy
函数。
2.
解释为什么要返回
char
*
。
答:
1.
char
*strcpy(
char
*
strDest
,
const
char
*
strSrc
)
{
char
*strDestCopy =
strDest
;
if
(
st
rDest
==
NULL
||
strSrc
==
NULL
)
{
th
row
(
);
}
while
((*strDestCopy++ =
*
strSrc
++) !=
'0'
);
return
strDest
;
}
2.
支持链式表达式
22.
判断一个字符串是不是回文,
当字符串是回文时
,
函数返回字符串
:
yes!,
否
则函数返回字符串
:no
。所谓回文即正向与反向的拼写都一样,例如
:adgda
p>
。
答:
#include
#include
#define
N
100
char
*judgeStrings(
char
*str);
int
main()
{
渥瑞达北美
IT
培训
char
a[
N
];
printf(
请输入要判断的回文字符串:
);
scanf(
, a);
printf(
,
judgeStrings(a));
return
0;
}
char
*judgeStrings(
char
*
str
)
{
if
(
str
==
NULL
)
throw
;
int
len =
strlen(
str
);
for
(
int
请输入要反序的字符串:
i=0; i
{
if
(<
/p>
str
[i] !=
str
[len - i - 1])
return
;
}
return
;
}
23.
递规反向输出字符串的例子
,
可谓是反
序的经典例程
,
那么任意输入一字符
串
,利用递归将其反向输出
.
#include
#define
N 20
void
getReverseChar(
char
*str);
int
main()
{
char
a[N];
printf(
);
scanf(
, a);
getReverseChar(a);
printf(
);
return
0;
}
void
getReverseChar(
char
*
str
)
{
if
(*
s
tr
==
'0'
)
return
;
else
{
ge
tReverseChar(
str
+1);
printf(
,
*
str
);
渥瑞达北美
IT
培训
}
}
24.
用指针的方法,将字符串“ABCD1234efgh”前后对调显示
#include
#include
int
main()
{
char
a[] =
;
char
*p = a;
int
len = strlen(a);
for
(
i
nt
i = 0; i < len/2; i++)
{
char
temp = a[i];
a[i] = a[len -
i - 1];
a[len -
i - 1] = temp;
}
printf(
, a);
return
0;
}
25.
两个字符串,
s,t;
把
t
字符串插入到
s
字符串中,
s
字符串有足够的空间存
放
t
字符串
答:
#include
#include
#define
N
100
int
main()
{
char
s[
N
] =
;
char
*t =
;
int
sLen = strlen(s);
int
tLen =
strlen(t);
int
pos;
printf(
请输入要插入的位置:
);
渥瑞达北美
IT
培训
}
scanf(
, &pos);
if
(pos > sLen || pos < 0)
return
0;
//
先将
s
字符数组后面的
字符放到后面(采用前插法,从
0
开始)
for
(
int
i = 0; i < sLen - pos;
i++)
{
s[pos +
tLen + i] = s[pos + i];
}
//
再放心的插入
t
字符数组
for
(
int
i = 0; i < tLen; i++)
{
s[pos+i] =
t[i];
}
s[sLen +
tLen] =
'0'
;
printf(
, s);
return
0;
26.
已知
strcmp
的原型是
int
strcmp(const
char
*str1,
const
char
*str2)
,不调用库函数,实现
s
trcmp
函数
答:
#include
#include
#define
N
100
int
strcmp(
const
char
*str1,
const
char
*str2);
int
main()
{
char
s[
N
];
char
t[
N
];
printf(
请输入要比较的一个字符串:
);
scanf(
, s);
printf(
请输入要比较的另一个字符串:
);
scanf(
, t);
printf(
,
strcmp1(s, t));
return
0;
}
int
strcmp(
const
char
*
str1
,
const
char
*
str2
)
{
int
len1 =
strlen(
str1
);
int
len2 =
strlen(
str2
);
int
maxLen = len1 > len2 ?
len1 : len2;
for
(
int
i = 0; i < maxLen; i++)
渥瑞达北美
IT
培训
}
{
if
(
st
r1
[i] >
str2
[i])
return
1;
else
if
(
str1
[i] <
str2
[i])
return
-1;
}
return
0;
27.
找出错误
#include
“
string.
h
”
void
main(void)
{ char *src=
char
*dest=NULL;
dest=(char
*)malloc(strlen(src));
int
len=strlen(str);
char *d=dest;
char *s=src[len];
while(len--!=0)
d++=s--;
printf(
}
答:
.h
用
<>
括起来。
= (char *)malloc(
strlen(src));
申请的空间不够,需要改为
des
t =
(char *)malloc(strlen(src)+1);
len =
strlen(str);
改为
int len =
strlen(src);
*s =
src[len];
改为
char *s = src[len
-1];
5.d++ =
s--;
改为
*d++ = *s--;
< br>6.
需要在
printf(
“%
s”,
dest
);
上面加上一行代码:
*d
=
‘
0’;
28.
写出输出结果
#include
void foo(int m, int n)
{
printf(
}
int main()
渥瑞达北美
IT
培训
{
}
int b = 3;
foo(b+=3, ++b);
printf(
return 0;
答:此题考察的有一些难度,深入到了编译器级别。编译器实现的不一样,那
么结果也是不一样的。在
vc6.0
下面,结果为
:
7 4 7
在
vs2012
结果为
7 7
7
< br>。在
xcode
下面是
6 7
7.
29.
分析:
int arr[] =
{6,7,8,9,10};
int *ptr = arr;
*(ptr++)+=123;
printf(“
%d %d
”, *ptr, *(++ptr));
答:此题和上一题目类似,考察的
是
printf()
函数的参数入栈顺序,从右往左
的运算。所以结果为:
8 8
30.
对下面程序进行分析,若有错误,请写出一个正确的程序段
void test2()
{
char string[10], str1[10];
int i;
for(i=0;
i<10; i++)
{
str1[i] = 'a';
}
strcpy(
string, str1 );
}
答:错误,主要是
str1[10]
字符数组没哟
0
。所以应该如下修改
:
for(i=0; i < 9; i++)
{
str[i]
= ‘a’;
}
str[i] =
‘
0’;
渥瑞达北美
IT
培训
31.
请问一下程序将输出什么结果?
char *RetMemory(void)
{
char p[] =
“hellow world”;
return p;
}
void
Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
<
/p>
答:
此程序存在的问题是
RetMemo
ry(void)
函数返回的是局部变量的地址,
然后
str
指向这个地址,
但是实际上这块地址已经
让编译器给释放,
编译器有可能把
这块内存分配给其它的变量。
所以如果内存没有被修改的话输出结果为
hello
worl
d,
如果被修改则输出结果未知。
32.
分析下面的程序:
void
GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
int main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,
free(str);
if(str!=NULL)
{
strcpy(str,
}
printf(
getchar();
}
答:程序存在的问题是:
GetMe
mory
函数成功的为
str
分配了一
块堆上的内存,
但是后来被释放掉了。
由于释放后没有将指针置
为空,
故
str
肯定不会为
NULL
。
接着调用
st
rcpy()
函数为
str
指向的空间
赋值。这是非法的,
str
指向的是已
经被释放的内存,故拷贝会失败。
渥瑞达北美
IT
培训
33.
下面的语句会出现什么结果?
char szstr[10];
strcpy(szstr,
p>
答:编译不通过,字符数组
szstr
空间
为
10
,但是字符串为
11
个(加上
0
)
,
故字符数组空间不够存下字符串。
34.
下面的程序会出现什么结果
#include
#include
void getmemory(char *p)
{
p=(char *)
malloc(100);
strcpy(p,
}
int
main( )
{
char
*str=NULL;
getmemory(str);
printf(
free(str);
return 0;
}
答:程序存在的问题是
str
没有指向申请出来
的空间,
str
还是为
NULL
。
free
()函数释放堆上的空间,可是<
/p>
str
并没有指向堆上的空间,故程序会出错。
< br>
35.
请问以下代码有什么问题:
int
main()
{
char a;
char *str=&a;
-
-
-
-
-
-
-
-
-
上一篇:PEP三年级下册英语第一单元教案复习课程
下一篇:英语应用文写作总结