好文档 - 专业文书写作范文服务资料分享网站

c语言的面试题_带答案-中软国际整理

天下 分享 时间: 加入收藏 我要投稿 点赞

则语句 printf(\的执行结果是: 考点:区别struct与union.(一般假定在32位机器上) 答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20. data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52.

10、请找出下面代码中的所有错误 (题目不错,值得一看)

说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba” #include\ main() {

char*src=\ char* dest=NULL; int len=strlen(src);

dest=(char*)malloc(len); char* d=dest;

char* s=src[len]; while(len--!=0) *d++=*s--; printf(\ return 0; } 答:

方法1:一共有4个错误; int main() {

char* src = \ int len = strlen(src);

char* dest = (char*)malloc(len+1);//要为分配一个空间 char* d = dest;

char* s = &src[len-1]; //指向最后一个字符 while( len-- != 0 ) *d++=*s--;

*d = 0; //尾部要加’\\0’

printf(\

free(dest); // 使用完,应当释放空间,以免造成内存汇泄露 dest = NULL; //防止产生野指针 return 0; }

方法2: (方法一需要额外的存储空间,效率不高.) 不错的想法 #include #include main() {

char str[]=\int len=strlen(str); char t;

for(int i=0; i

t=str[i];

str[i]=str[len-i-1]; //小心一点 str[len-i-1]=t; }

printf(\return 0; }

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

void main() { char str[] = \ cout << \字符长度为: \/是数组的大小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(\ptr-1)); }

输出: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=\常量的内容不能改,可定义为数组 printf(\s[0]='B';

printf(\有什么错?

答: \是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。 cosnt char* s=\

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

7.用变量a给出下面的定义

a)一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer) h) 一个有10个函数指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer ) 答案是:

Int (*p[10])(int);

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int);// A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

3.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

c语言的面试题_带答案-中软国际整理

则语句printf(\的执行结果是:考点:区别struct与union.(一般假定在32位机器上)答:DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小是20.data是一个struct,每个变量分开占用空间.依次为int4+DATE20+double8=32.所以结果是20+32=52.
推荐度:
点击下载文档文档为doc格式
5ract93t2v79c964huz1
领取福利

微信扫码领取福利

微信扫码分享