深入学习C语言知识点
深入学习C语言知识点checklist——测试你掌握C的程度的答案 2011-05-03 16:06:08| 分类: 编程 | 标签: |字号大
中
小 订阅
深入学习C语言知识点checklist——测试你掌握C的程度的答案
前些日子在网上转载了一篇日志《关于深入学习C语言知识点checklist——测试你掌握C的程度》,这篇文章的引用真是无所不在,但找不到关于它的答案。于是突发奇想,用了两天时间整理了篇答案。全是自己的见解,希望对大家的学习有帮助。
一.字符串
(1)strlen()函数的返回值是什么类型的?
strlen()函数的返回类型是unsigned int,在此需要注意unsigned int的一些操作。两个unsigned int的操作结果还为unsigned int,unsigned int和int的操作结果会自动转换为int。所以如果使用if(strlen(a) - strlen() < 0)这样的判断语句,结果永远为真。
(2)字符串strlen()的值,是否和他占据的内存空间相同?
strlen()函数得到的长度是从字符串始地址开始到空字符的字节数,并不包括最后的空字符。
(3)你是否知道strcpy函数存在的潜在风险?如何避免?
strcpy(char *a, char *b)函数将b字符串整个复制到从a开始的地址处,复制后字符串a和b完全一样。如果b的长度大于a初始长度,就会将a后面的内存部分覆盖掉。标准C这样设计库函数体现了C语言的灵活性,这需要程序员自己设计安全的程序。要想避免溢出,必须确保b的长度不大于a的初始长度。或者给a重新分配更大长度的内存地址,将b复制进去。C中有限制复制长度的标准函数strcpy(char *a, char *b, size_t len),这个函数只从b中复制len个字符到a,但a的结果将不是以NUL字节结尾。如果使用这个函数,最后必须自己添加代码,将适当内存写为‘\0’,一般a[len - 1] = '\0';
(4)如果一个字符串没有字符串结束符,而调用str开头的库函数,会发生什么?
如果一个字符串没有字符串结束符,而调用str开头的库函数,返回的结果是从初始地址开始到它之后为'\0'的内存处为止中间的字节数。
(5)Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化?
strcpy(char *a, char *b)函数将b中的字符串复制到字符串a的起始地址处,将a原来的字符串覆盖,以'\0'结尾。
strcat(char *a, ch
ar *b)函数从字符串a的下一个地址(即从‘\0’开始)为初始地址,将b复制到此处,以'\0'结尾。如果a和b重叠,结果不可预测。
strcmp(char const *a, char const *a),按照字典排序的顺序,如果a小于b,返回小于零的值;如果a大于b,返回大于零
的值。如果两字符串相等,返回0。
strncpy,strncat和strncmp分别比strcpy,strcat,strcmp多了一个参数size_t len。和strcpy一样,strncpy把源字符串的字符复制到目标数组。然而它总是正好向a写入len个字符。如果strlen(b)的值小于len,a数组就用额外的nul字节填充到len长度。如果strlen(b)大于len,那么只有len个字符被复制到a中。注意!它的结果不会以nul字节结尾。
strncat和strcat类似,不过它只会复制len个字符添加到a的后面。和strncpy不同的是,它以nul作为结尾。strncat()最多向目标数组复制len个字符(再加一个结尾的nul字节),它才不管目标a除去原来存在的字符串后留下的空间够不够。
strncmp()最多只比较前len个字符,功能和strcmp()类似。
具体实现见标准函数库,个人觉得实现没有难度,很容易实现。
(6)上面这些函数使用时,各有哪些需要注意的地方?你会几种字符串查找操作?c语言中有字符串这个数据类型吗?对字符串进行操作的时候,是否为字符串结尾符预留存储位置不然的话容易造成非法访问内存。
上面几个函数需要注意的地方都已指出。
个人觉得这些字符串操作都要熟悉!
其实char *就相当于字符串类型,string.h中的所有库函数几乎都是针对字符指针操作的。
答案是:是!字符串必须以'\0'结尾,才能识别到结束,否则会一直向下搜索。在字符串声明 操作中都必须预留结尾符的存储位置。
二.数组
(1)你知道几种数组初始化的方法?
数组可以在声明时静态初始化,也可以在以后动态赋值,数组初始化前是不可以使用数组值的。
(2)数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结?
这个答案在我的另一篇日志“C数组和指针的区别---自己总结的”里有详细介绍。
(3)“int calendar[10][20];”,这是一个什么样的数组?它拥有10数组类型的元素,还是20个?
这个很显然是二位数组,它包含十个数组类型元素。
(4)“int a[10];”,数组名a在本质上是一个什么?你是否打印过a的值?
数组名a相当于一个指针,指向数组a的第一个元素。a作为右值,是该数组第一个元素的地址。
(5)你知道几种获取数组某元素的方法?
只要知道了该元
素的数据类型和地址,就可以很容易的获取该元素。例a[n],*(a + (m * n))......
(6)指针和数组相同吗?什么时候相同?什么时候不同?
上面第二个问题中已回答。需要注意的是,声明数组时会给该数组分配相应的内存空间,而声明指针时只分配一个4字节的内存空间保存指
针值。
(7)用指针和下标访问数组元素,那种方式更快?
指针表达式可能比下表表达式效率更高,但下标表达式绝不可能比指针表达式效率更高!(C和指针)
三.结构体
(1)你知道什么是位域结构体吗?如何定义它?如何使用它?
位域结构体和一般的结构体类似,不过它的成员是一个或多个的位段,这些不同长度的位段实际上存储于一个或多个整形变量中。
定义:位段的声明和普通结构成员声明相同。但有两个例外,首先,位段必须声明为int,unsigned int活signed int类型;其次,在成员名的后面是一个冒号和一个整数,整数指定位段占用的位的书目。
使用:保存在整形变量中,可以直接对这些整形变量进行位操作。
(2)你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的大小?
编译器按照成员列表的顺序一个接一个的给每个成员分配内存,每个成员都满足边界对齐,他们之间可能存在额外的内存空间。
如果某个机器的整形长度为4字节,并且该结构的起始存储位置能够被4整除,那么所有成员的起始位置必须被4整除!我们可以按照这个原则给结构体分配内存空间,也很容易计算出它实际占有的内存空间。
四.宏
(1)你知道宏的本质是什么吗?函数?语句?类型定义?或者其他?
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)。宏就是宏,不要将它理解为一个函数,语句或类型定义或者任何已存在的C语法,因为宏有自己的语法规定。
(2)你知道语言设计者为什么设计宏吗?这些原因目前是否仍然成立?
设
…… 此处隐藏:6527字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [政务民生]2013年公共基础知识热点问题(七)
- [政务民生]检验检测机构资质认定评审准则及释义20
- [政务民生]关于印发重庆市房屋建筑和市政基础设施
- [政务民生]1、隧道洞身开挖支护施工技术交底书
- [政务民生]2015年山东省17地市中考语文试题分类汇
- [政务民生]2-高级会计师资格考试和评审流程图
- [政务民生]2018版中国清分机行业发展分析及前景策
- [政务民生]新课改高中政治探究
- [政务民生]2018-2024年中国新型组合房屋行业投资
- [政务民生]2015年上海市春季高考数学模拟试卷五
- [政务民生]灌砂法及环刀法测压实度(带计算过程)
- [政务民生]运筹学实验2求解非线性规划
- [政务民生]劝学、逍遥游默写(教师卷)
- [政务民生]《运筹学》 - 期末考试 - 试卷A - 答案
- [政务民生]八年级英语下册 Module 6 Hobbies测试
- [政务民生]2019年宪法知识竞赛试题库100题(含答
- [政务民生]自动化英文文献翻译
- [政务民生]公文格式实施细则
- [政务民生]高一地理上册课堂跟踪练习题6
- [政务民生]会计继续教育习题及答案
- 第三章 无约束最优化方法
- 泛读教程第三册答案
- 魏晋南北朝文学
- 幂的运算复习题
- 城市环境问题的成因与治理策略_以社会
- 钢结构行业产业链及竞争分析研究
- 新型热塑性弹性体增韧聚丙烯的研究
- 中国旅游地理B卷试题及答案
- (苏教版)五年级数学上册第三单元测试卷
- 不稳定性心绞痛诊断与治疗
- 俞氏国际后勤职能部门绩效考核办法
- GB7258-2017新标准考试题含答案
- 小学生汉字听写比赛活动方案
- 1.3《平抛运动》学案 教科版必修2
- 2011香港特别行政区公务员考试复习资料
- 考虑水力条件变化的城市给水管网可靠性
- 表面活性剂在油田开发和生产中的应用
- ITT内部培训资料-FI端吸泵的介绍
- 文明守纪,从我做起学生发言稿
- 初中读《聊斋志异》心得体会800字范文




