C程序员面试题.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《C程序员面试题.doc》由会员分享,可在线阅读,更多相关《C程序员面试题.doc(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.char * const p;char const * pconst char *p上述三个有什么区别?char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *p-2.char str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;char *str7 = abc;char *str8
2、 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) endl; 打印结果是什么?解答:结果是:0 0 1 1str1,str2,str3,str4是数组变量,它们有各自的内存空间;而str5,str6,str7,str8是指针,它们指向相同的常量区域-3. 以下代码中的两个sizeof用法有问题吗?void UpperCase( char str ) / 将 str 中的小写字母转换成大写字母 for( size_t i=0; isiz
3、eof(str)/sizeof(str0); +i ) if( a=stri & stri=z ) stri -= (a-A );char str = aBcDe;cout str字符长度为: sizeof(str)/sizeof(str0) endl;UpperCase( str );cout str endl;答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当
4、指针看,一个指针为4个字节,因此返回4。-4.main()int a5=1,2,3,4,5;int *ptr=(int *)(&a+1);printf(%d,%d,*(a+1),*(ptr-1); 输出结果是什么?答案:输出:2,5*(a+1)就是a1,*(ptr-1)就是a4,执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int *ptr=(int *)(&a+1);则ptr实际是&(a5),也就是a+5原因如下:&a是数组指针,其类型为 int (*)5;而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小
5、不同。a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a5但是prt与(&a+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样 a是数组首地址,也就是a0的地址,&a是对象(数组)首地址, a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5.-5.请问以下代码有什么问题:int main()char a;char *str=&a;strcpy(str,hello);printf(str);return 0;答案:没有为str分配内存空间,将会发生异常。问题出在将一个字符串复制
6、进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。-6. char* s=AAA;printf(%s,s);s0=B;printf(%s,s);有什么错?答案:AAA是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosnt char* s=AAA;然后又因为是常量,所以对是s0的赋值操作是不合法的。-7. int (*s10)(int) 表示的是什么?答案:int (*s10)(int) 函数指针数组,每个指针指向一个int func(int param)的函数。-8.有以下表达式:int a=248; b=4;int const
7、c=21;const int *d=&a;int *const e=&b;int const *f const =&a;请问下列表达式哪些会被编译器禁止?为什么?*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;答案: *c 这是个什么东东,禁止*d 说了是const, 禁止e = &a 说了是const 禁止const *f const =&a; 禁止-9.#include #include void getmemory(char *p)p=(char *) malloc(100);strcpy(p,hello world);int main( )char *str=N
8、ULL;getmemory(str);printf(%s/n,str);free(str);return 0; 分析一下这段代码答案:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险博主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char *) malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针void getmemory(char *p),这样malloc返回的地址付给*p(
9、即str变量本身)。-10.char szstr10; strcpy(szstr,); 产生什么结果?为什么?答案:长度不一样,会造成非法的OS-11.要对绝对地址0x赋值,我们可以用(unsigned int*)0x = 1234; 那么要是想让程序跳转到绝对地址是0x去执行,应该怎么做?答案:*(void (*)( )0x ) ( );首先要将0x强制转换成函数指针,即:(void (*)()0x然后再调用它:*(void (*)()0x)();用typedef可以看得更直观些:typedef void(*)() voidFuncPtr;*(voidFuncPtr)0x)();-12. 分
10、析下面的程序:void GetMemory(char *p,int num) /p,指向指针的指针,*p,p指向的指针(即str),*p,最终的对象,str指向的单元*p=(char *)malloc(num); /申请空间首地址付给传入的被p指向的指针,即str int main() char *str=NULL;GetMemory(&str,100); /传入指针变量本身的地址strcpy(str,hello);free(str);if(str!=NULL)strcpy(str,world); printf(n str is %s,str); 软件开发网 getchar(); 问输出结果是
11、什么?答案:输出str is world。free 只是释放的str指向的内存空间,它本身的值还是存在的.所以free之后,有一个好的习惯就是将str=NULL.此时str指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储空间是可能被重新分配给其他变量的,尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了),但是通常会打印出world来。这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你malloc一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些),然后在这块空间中记录一些管理信息(一般是在你申请的内存 前面一
12、点),并将可用内存的地址返回。但是释放内存的时候,管理库通常都不会将内存还给操作系统,因此你是可以继续访问这块地址的。-13.char a10;strlen(a)为什么等于15?#include stdio.h#include string.hvoid main()char aa10;printf(%d,strlen(aa);答案:sizeof()和初不初始化,没有关系;strlen()和初始化有关。-14.char (*str)20;/*str是一个数组指针,即指向数组的指针*/char *str20;/*str是一个指针数组,其元素为指针型数据*/-15.#include#include
13、#include #include #include #include typedef struct AA int b1:5; int b2:2;AA;void main()AA aa;char cc100;strcpy(cc,abcdefghijklmnopqrstuvwxyz);memcpy(&aa,cc,sizeof(AA);cout aa.b1 endl;cout aa.b2 endl;输出结果是多少?答案:-16和 首先sizeof(AA)的大小为4,b1和b2分别占5bit和2bit.经过strcpy和memcpy后,aa的4个字节所存放的值是: 0,1,2,3的ASC码,即,所以
14、,最后一步:显示的是这个字节的前位,和 之后的位分别为:10000,和01,因为int是有正负之分几道经典语言面试题作者:lingfen1552出处:更新时间: 2007年05月23日一、预处理器(Preprocessor)1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR(60* 60* 24* 365)UL考点:1).#define语法的基本知识(例如:不能以分号结束,括号的使用,等等)2).懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算
15、出实际的值,是更清晰而没有代价的。3).意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。4).表达式中用到UL(表示无符号长整型)2.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B)(A)=(B)?(A):(B)这个测试是为下面的目的而设的:1).标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。2).三重条件操作符的知识。这个操作符
16、存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。3).懂得在宏中小心地把参数用括号括起来4).讨论下面宏的副作用,例如:当你写下面的代码时会发生什么事?least= MIN(*p+, b);二、数据声明(Data declarations)用变量a给出下面的定义a)一个整型数(An integer)b)一个指向整型数的指针(A pointer to an integer)c)一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a
17、 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&
18、nbsppointer 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 argum
19、ent and return an integer)答案是:a) int a;/ An integerb) int*a;/ A pointer to an integerc) int*a;/ A pointer to a pointer to an integerd) int a10;/ An array of 10 integerse) int*a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序员 试题
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内