`
izuoyan
  • 浏览: 9224048 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

C语言测试题的讲解分析

阅读更多
下面是网友Jackie214发布的答案,其认真态度令我深受感动.这些题是我2000年在做培训时为学员们设计的,但我已经近6年没有接触过vc++下的c语言编程了,有9年没接触unix下的c语言编程了,所以,除了一些核心思想令我终生难忘外,其他一些语法细节和当初出题的意图何在,我也差不多忘记了!前天把这个测试题发布出来,是因为前一阵才知道我多年前写的一些内容又要被别人加入到其书籍中出版(我只是对一些人惯于借鉴别人的东西而当作自己成就的性格很不赞赏,但这般行为在商业上来说是无可厚非,甚至是值得学习,只是我自己做不出这样的事情来,反而有点自己没胆量吃葡萄,就说吃葡萄的人酸),当时非常生气,就又翻腾出了这些快被自己遗忘的东西,前几天就顺便把这个测试题发表在自己的blog里了.我没有受过正规的计算机教育,除了自学过谭浩强的那本入门级的c语言,也没有看过c语言方面的经典名著,很多东西都是自己瞎摸索出来的,所以有自己的讲课思路,但不一定严谨,还请看客多多谅解!
另外,我有过一段开发实践和教学经历后,回过头来看谭老爷子的那本c语言书,觉得写得真的很不好,没抓主重点,讲解也不通俗,很多人都这么认为,但也没有人能下定决心,吃上两年的苦,写一被绝对好过老谭的书,我曾经有过这般想法,但一直未能实施!我期望书能通过试验来让读者轻松学懂,并且学懂后还不容易忘记,所以要把原理性的东西用通俗易懂的方式表现出来,还要高度总结出核心思想,如果谁有这方面的心愿,不妨与我合作!
下面是网友Jackie214发布的答案,随后是我的一点补充.
Jackie214发表于2006-05-19 11:47 AMIP: 61.154.9.*
int x=35;
char str[10];

//问:strlen(str)和sizeof(str)的值分别是多少?
// strlen(str) 值不确定,strlen根据'\0'确定字符串是否结束。
// sizeof(str)=10 sizeof一个数组为数组长度

strcpy(str,"www.it315.org"/*共13个字母*/);
//问:此时x和strlen(str)的值分别是多少?
// x 为35
// strcpy(char* dest, const char* src)
// 根据src来复制dest,依照src的'\0'决定复制的长度,而dest必须要提供足够的长度,这里会引起溢出,strlen返回13,但是数组外部的数据已经被破坏
//(作者注:我下面给出了更确切的答案)

str="it315.org";//编译能通过吗?
// 数组不能赋值,只能初始化。char str[10] = "it315.org";
// 而且初始化时编译器会检查数组的长度与初始化串的长度是否匹配

char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句编译能通过吗?运行时有问题吗?
// 可以通过编译,但是pstr指向了常量区,运行时最好只做读操作,写操作不保险
//(作者注:我下面给出了更确切的答案)

const char *p1;
char * const p2;
//上面两句有什么区别吗?
// const char* 和 char const* 一样,都是表示指向常量的字符指针。
// char * const 表示指向字符的常量指针

p1=(const char *)str;
//如果是p1=str;编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?
// 可以通过编译。关于常量与非常量指针的关系是这样的:
// const指针可以指向const或者非const区域,不会造成什么问题。
// 非const指针不能指向const区域,会引起错误。

strcpy(p1,"abc");//编译能够通过吗?
// 不能通过,strcpy( char*, const char*); char* 不能指向const char*

printf("%d",str);//有问题吗?
// 没有问题,输出的是str的地址信息。

pstr=3000;//编译能过吗?如果不行,该如何修改以保证编译通过呢?
// 不能通过,char* pstr表示pstr是个字符指针,不能指向3000的整形变量。
// 修改的话,可以这样:pstr = (char*)3000,把pstr指向3000这个地址;

long y=(long)pstr;//可以这样做吗?
// 可以,y的值为pstr所指的地址。不过如果是纯粹要地址的话,最好是用unsigned long。

int *p=str;
*p=0x00313200;
printf("%s",str);//会是什么效果?提示0x31对应字符'1',0x32对应字符'2'。
// 首先编译未必会过关,有些编译器可能不允许int * 直接指向char*。最好是改为int *p = (int*)str;
// 过关了效果就是什么东西都没有。int *p=str; p为str所指的地址,*p表示修改了str所指向的内存。
// 由于sizeof(int)在32位机上,int有4个字节(其实具体要看编译器的配置文件,好像是limit.h,一般是4个字节)所以修改了str[0]-str[3]
// 由于0x00313200头尾都是0,所以字符串为'\0'开头,什么都打印不出来。这里有个Big-endin和little-endin的问题。以0x31323334为例
// little-endin的机器上面,0x31323334在内存中排列顺序为34 33 32 31,输出为4321,如INTEL芯片的pc
// big-endin机器上面为31 32 33 34 ,输出为1234,如IBM POWERPC

p=3000;//p+1的结果会是多少?
// 3000+sizeof(int); 指针+1均为原来地址加上sizeof(指针所指的数据类型)

char *pc=new char[100];//上述语句在内存中占据几个内存块,怎样的布局情况?
// 本身pc会占用函数栈一个4字节的指针长度(具体是否为4个字节要看机器和编译器)。
// new会在堆上申请100个字节sizeof(char)的连续空间。

void test(char **p)
{
*p=new char[100];
}//这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?
// 该程序没有问题。需要在函数中对指针所指的地址进行变化是必须传人指针的地址。
// 原因是这样的:如果传入的为指针本身,在函数调用的时候,实参会被复制一个实例,这样就不是原来的指针了,对该指针本身进行的任何改变都不能传递回去了。
// 可以这样理解,如果传入的参数为int,那么对int本身的值的改变就传不回去啦,加个*也是一样的。


//能明白typedef int (*PFUN)(int x,int y)及其作用吗?
// 定义了一个函数指针类型的宏,这样PFUN就表示指向返回值为int,且同时带2个int参数的函数指针类型了。
// 可以用来定义这样的变量:
// 比如有个函数为int fun( int x, int y );
// PFUN p = fun;
//(作者注:我下面给出了更确切的答案)
--------------------------------------------------------------------------------------------------------------
下面是我的一点补充:
第二题:
int x=35;
char str[10];
strcpy(str,"www.it315.org"/*共13个字母*/);
//问:此时x和strlen(str)的值分别是多少?
答:strlen的值为13,在VC++环境下,x的值是要改变的(其他编译器下没试,).虽然表面上看来,在程序中并没有修改x的值,但是实际运行的结果是上面的x的值发生了修改,这是因为strcpy以后,把多余的数据拷贝进了str的邻居(int类型的x)中,所以x的数据也就变了.这是一个曾让我刻骨铭心的问题,在我刚出道时遇到这个问题,虽然在朋友的帮助下解决了这个问题,但一直不明白x的值为何变了,只有最后走上培训教师的岗位,才开始梳理自己曾经的困惑,才开始总结以前的经验供学员们借鉴.我觉得这个题目的价值非常之大,它能引起学员对字符串拷贝越界问题的足够重视,并且通过这个问题更能明白字符串的处理是怎么回时,更能明白字符串与字符数组的关系:字符串就是一个字符数组,只是把这个字符数组用在处理串的函数中时,这些函数不考虑数组的长度,只是记住数组的首地址,从首地址开始处理,并在遇到0时结束处理,
第四题:
char *pstr;
strcpy(pstr,"http://www.it315.org");
//上句编译能通过吗?运行时有问题吗?
答: 编译可以通过,但是pstr没有进行有效的初始化,它指向了一个不确定的内存区,运行时会出现内存不可写错误!
最后一题:
//能明白typedef int (*PFUN)(int x,int y)及其作用吗?
答:函数指针最大的用处在于它可以被一个模板方法调用,这是我在学java的设计模式时领悟到的.例如,有两个函数的流程结构完全一致,只是内部调用的具体函数不同,如下所示:
void func1()
{
//一段流程代码和面向方面的代理,如安全检查,日志记录等
int sum = add( x , y);
//一段流程代码和面向方面的代理,如安全检查,日志记录等
}
void func2()
{
//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
int difference = sub( x , y);
//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
}
那么,可以只定义一个函数,如下所示
void func(PFUNC p)
{
//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
int difference = p( x , y);
//与func1完全相同的一段流程代码和面向方面的代理,如安全检查,日志记录等
}
调用程序在调用时,让参数p分别指向add和sub函数就可以了.
对于其他题目的讲解,由于我目前写作和工作的重点已完全不在c语言方面了,也没有时间一一解答,就借用Jackie214发布的答案来回应大家.
分享到:
评论

相关推荐

    C语言测试题+C语言习经验+c语言编程+学生信息管理系统+超市管理系统

    首先,"C语言测试题"部分提供了检验你对C语言基础知识理解的练习。这些测试题涵盖了变量、数据类型、控制结构(如if-else、switch-case、循环)、函数、指针、数组、结构体等核心概念。通过解答这些题目,你可以检查...

    C语言堂上测试真题五等15个文件.zip

    4. **C语言堂上测试真题三.doc**:这是一个完整的C语言课堂测试试卷,可能包括选择题、简答题和编程题,覆盖了C语言的核心概念和技术。 5. **C语言.docx**:此文档可能包含了C语言的基础教程或特定主题的讲解,如...

    蓝桥杯C语言历年真题及相关资料

    其次,相关资料可能涵盖了C语言的基础知识讲解、进阶技巧、编程实践案例以及解题策略等。基础部分包括C语言的基本语法、数据类型、运算符、流程控制等;进阶部分可能涉及内存管理、预处理器、位运算等复杂概念。这些...

    嵌入式系统开发人员C语言测试题-编程风格-选择题.doc

    通过以上分析,我们不仅复习了C语言编程风格的基本知识点,还深入了解了如何编写规范且易于理解的代码。这对于嵌入式系统的开发尤其重要,因为良好的编程习惯可以减少错误的发生,提高代码质量,从而确保系统的稳定...

    c语言上机试题

    试题类型包括单选题、填空题、程序填空题、程序分析题和编程题,总分为100分。编程题特别强调了循环结构和选择结构的综合应用,要求考生能够结合这两种结构实现对数组的操作。 实验部分分为练习和作业两部分。练习...

    北航数据结构与C语言(真题,课件,自主招生试题)

    课件通常由教师精心准备,包含课堂讲解的要点、实例和习题,可以帮助考生深入理解课程内容。通过学习课件,考生可以系统地学习数据结构的理论知识,了解各种数据结构的实现方法,以及如何用C语言进行编程。同时,...

    二级C语言程序设计题库.zip

    题库中的题目将涵盖这些领域,通过做题,考生可以检测自己的知识水平,找出不足,提升解决问题的能力。 【标签】"c语言题库"指示了这个文件的主要内容是关于C语言的练习题目。C语言是一种广泛应用的编程语言,因其...

    c语言名题精选百则,各种精彩的c语言名题算法技巧

    1. **名题**:这些题目通常是编程竞赛或面试中常见的问题,如Fibonacci序列、八皇后问题、汉诺塔等,它们旨在测试程序员对数据结构、算法和逻辑思维的理解。 2. **算法**:C语言中的算法包括排序(如冒泡排序、选择...

    四川省历年2级c语言真题

    本压缩包中的资源“新建文件夹”中包含了历年真题及答案和讲解注释,这对于备考者来说是宝贵的参考资料。通过仔细研究这些真题,你可以了解考试的题型、难度和出题趋势。解答部分可以帮助你检查自己的理解是否正确,...

    《数据结构》(C语言版)严蔚敏版本 课后习题全部详解

    4. 结果验证:说明如何验证程序的正确性,可能涉及边界条件测试和性能分析。 5. 拓展思考:讨论问题的变种或更复杂的情况,激发读者深入思考。 通过这些习题详解,读者可以系统地学习数据结构的各个重要概念,如...

    全国计算机C语言二级上机题库

    软件工程基础探讨软件开发的过程,包括需求分析、设计、实现和测试。数据库设计基础则讲解数据库的概念、关系模型和SQL语言。 在上机题库中,考生应熟练掌握各种数据结构的表示和操作,例如线性表的顺序存储结构和...

    C语言难点分析整理

    60. 高级C语言程序员测试必过的十六道最佳题目+答案详解 297 61. C语言常见错误 320 62. 超强的指针学习笔记 325 63. 程序员之路──关于代码风格 343 64. 指针、结构体、联合体的安全规范 346 65. C指针讲解 352 66...

    《C语言程序设计》课后习题参考答案

    在“《C语言程序设计》课后习题参考答案.doc”文档中,你可以找到每一题的详细解答,包括但不限于以下几个方面: 1. 变量与数据类型:理解C语言中的基本数据类型,如int、char、float、double,以及如何声明、初始...

    C语言科后题编程题源码 C语言程序设计-大连理工大学出版社

    这是一本在C语言教育领域具有较高声誉的教材,以其深入浅出的讲解和丰富的习题著称。 C语言是一种基础且强大的编程语言,它是计算机科学教育中的必修课程。通过解决这些编程题目,学习者可以深入理解C语言的核心...

    C语言程序设计第二章习题参考答案

    虽然第二章可能不深入讲解,但习题可能会简单提及。 9. **预处理指令**:如#define定义常量,#include引入头文件等。虽然一般在第一章介绍,但在做习题时可能会用到。 10. **基本的错误处理和调试技巧**:例如了解...

    c语言复习资料级讲解

    选择题涉及语法、逻辑和概念理解,程序填空题考察对语句结构的掌握,程序结果预测要求理解程序执行流程,而编程题则测试实际编程能力。每个部分的分数分布反映了对不同技能的重视程度,例如,选择题和填空题侧重基础...

    谭浩强 C语言程序设计(第三版)课后习题答案

    《谭浩强 C语言程序设计(第三版)》是一本深受初学者喜爱的C语言教材,其详尽的讲解和丰富的习题集为学习者提供了扎实的编程基础训练。课后习题是检验和巩固学习效果的重要环节,而这份“谭浩强 C语言程序设计(第...

    C语言习题2012_new.doc

    第二部分是"综合模拟测试题",提供了六个模拟试题,每个试题包含了多种类型的题目,如选择题、填空题、编程题等,以检验学习者对C语言的理解程度和应用能力。 这些模拟试题覆盖了第一部分的所有主题,旨在通过实战...

Global site tag (gtag.js) - Google Analytics