c语言的面试题 - 带答案副本(3)

2019-03-04 13:15

}

3.Heap与stack的差别。 答:Heap是堆,stack是栈。

Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。

Stack空间有限,Heap是很大的自由存储区

C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。

程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行

// 1 2 4 8 16。。。

// 1 10 100 1000 1 0000 // 0 1 11 111 1111

3 一语句实现x是否为2的若干次幂的判断 #define is2*n(x) ((x & (x - 1))? 0 : 1) int main(void) {

int m = 512;

cout << ((m & (m - 1)) ? false : true) << endl; //即当m中只有一位为1时,才为若干次幂值

//考试大提示:若有两个及以上1,则(m & (m - 1))不为0,输出0,表示不为2的若干次幂 return(0); }

类比:x为2的若干次幂即表示x中1的位数为1,题目转化为求一个32位数中1的位数,如果为1,则表示该数为2的若干次幂

同理也可以利用此规则求一个32位数中1的位数, (m & (m - 1)每次可用消除一个1,计算的次数即为1的个数 !

2. 下述三个有什么区别? char * const p; char const * p const char *p 解答:

char * const p; //常量指针,p的值不可以修改

char const * p;//指向常量的指针,指向的常量值不可以改 const char *p; //和char const *p

3. 解释下列输出结果 char str1[] = \char str2[] = \

const char str3[] = \const char str4[] = \const char *str5 = \const char *str6 = \char *str7 = \char *str8 = \

cout << ( str1 == str2 ) << endl; cout << ( str3 == str4 ) << endl; cout << ( str5 == str6 ) << endl; cout << ( str7 == str8 ) << endl; 结果是:0 0 1 1

解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;

而str5,str6,str7,str8是指针,它们指向相同的常量区域。节

省内存。

4. 以下代码中的两个sizeof用法有问题吗?[C易] #include #include \

void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母 { int i;

for( i=0; i

if( 'a'<=str[i] && str[i]<='z' )

str[i] -= ('a'-'A' );//由小写转大写 }

void main() {

char str[] = \

cout << \字符长度为: \endl;//是数组的大小6 UpperCase( str ); cout << str << endl; }

答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为8,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用

于上只将其当指针看,一个指针为4个字节,因此返回4。

注意:数组名作为函数参数时,退化为指针.

数组名作为sizeof()参数时,数组名不退化,因为sizeof不是函数.

4. 一个32位的机器,该机器的指针是多少位 2^32 =4G 地址总线宽度决定了CPU可以访问的物理地址空间.简单地说就是CPU到底 能够使用多大容量的内存.对于386以上的微机系统.地址线的宽度为32位.最多可以直接访问4096MB (4GB)的物理空间.对大多数人来说已经够用了.

指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。

8位处理器、16位处理器、32位处理器和64位处理器,其计数都是8的倍数。它表示一个时钟周期里,处理器处理的二进制代码数。“0”和“1”就是二进制代码,线路上有电信号,则计做1,没有电信号则为0。8位机有8条线路,每个时钟周期有8个电信号,组成一个字节。所以,随8位处理器上升至64位处理器,每个时钟周期传送1个字节到8个字节,关联到时钟速度提高到若干个千兆赫之后,处理器处理信息的能力越来越大。

CPU 的一次基本运算 (and, or, xor, not), 能处理/运算几个 bits. 64 bits data 交由 32-bit CPU 去运算, 得分两次才行.

5. 指出下面代码的输出,并解释为什么。(不错,对地址掌握的深入挖潜)

main() {

int a[5]={1,2,3,4,5};

int *ptr=(int *)(&a+1);//指针是数组类型,+1相当于加20.如果是(a+1)是+4

printf(“%d %d”,a,ptr);

printf(\}

输出:1245036 1245056 2,5

a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

6.请问以下代码有什么问题: 1).

int main() {

char a;

char *str=&a; strcpy(str,\printf(str); return 0; }

答;没有为str分配内存空间,将会发生异常

问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。 2).

char* s=\常量的内容不能改,可定义为数组


c语言的面试题 - 带答案副本(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:基于单片机的数字温度计设计(附代码及仿真)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: