C语言学习计划

一、要学习的书

       《c缺陷和陷阱》、《c和指针》、《c专家编程》。

二、知识点学习


①字符串      

1、 strlen()函数的返回值是什么类型的?

2、 字符串strlen() 的值,是否和他占据的内存空间相同?

3、 你是否知道strcpy 函数存在的潜在风险?如何避免?

4、 如果一个字符串没有字符串结束符,而调用str 开头的库函数,会发生什么?

5、 Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()内部到底是如何运行的?这些函数到底对源字符串和目标字符串做了些什么?你是否观察过它们运行时两个字符串内存的变化?

6、 上面这些函数使用时,各有哪些需要注意的地方?

7、 你会几种字符串查找操作?

8、 c语言中有字符串这个数据类型吗?

9、 对字符串进行操作的时候,是否为字符串结尾符预留存储位置?不然的话容易造成非常访问内存。


②数组

1、  你肯定知道,定义“int a[10]; ”, a[10] 这个元素是无效的。

2、  你知道几种数组初始化的方法?

3、  数组和指针有千丝万缕的联系而又不同,你是否对他们在不同情况下的使用进行过详细的总结?

4、  “int calendar[10][20]; ”,这是一个什么样的数组?它拥有 10 数组类型的元素,还是 20 个?

5、  “int a[10]; ”,数组名 a 在本质上是一个什么?你是否打印过 a 的值?

6、  你知道几种获取数组某元素的方法?

7、  指针和数组相同吗?什么时候相同?什么时候不同?

8、  用指针和下标访问数组元素,那种方式更快?


③结构体

1、 你知道什么是位域结构体吗?如何定义它?如何使用它?

2、 你知道字节对齐对结构体占用内存空间大小的影响吗?如何计算结构体占用内存的大小?


④宏

1、 你知道宏的本质是什么吗?函数?语句?类型定义?或者其他?

2、 你知道语言设计者为什么设计宏吗?这些原因目前是否仍然成立?

3、 你会设计带有参数的宏吗?

4、 你知道使用宏的参数的的时候的注意事项吗?

5、 你会设计带有可变参数的宏吗?

6、 你知道使用宏有什么劣势吗?

7、 你有没有更好的替代方案?


⑤枚举

1、 是否可以指定枚举中各项的值?

2、 如果不指定值,枚举的第一个值是多少?

3、 枚举的值是否可以是负数?

4、 定义枚举的时候,你是否专门定义了枚举的最小值和最大值?


⑥switch

1、 switch(c)中的 c 的数据类型有哪些?

2、 你是否在所有的switch 中都加了 default 语句?

3、 是否在所有的case 中都加了 break 语句(一般情况的做法)?如果你不加 break ,将会发生什么?


⑦static

1、  static的三个主要作用是什么?

2、  static的修饰的局部变量是保存在什么地方的?全局变量哪 ?

3、  static修饰的全局变量和函数,在其他的文件中是否可以访问?如何访问?

4、  你知道static 是 c 语言中实现封装和隐藏的利器吗?你是否经常使用?

5、  定义在不同源文件中的static 全局变量,编译器是否允许他们的变量名称相同?他们在内存中的地址是否相同?函数那?


⑧const

1、 你是否经常使用const 来表明不能够被更改的变量?

2、 你是否经常使用const 常量来代替宏?

3、 下面四种情况,你知道是各表示什么意思吗?

int  i_value= 10; 

const  int* pvalue = & i_value

int  const *pvalue = & i_value
int*  const  pvalue=& i_value

const  int* const  pvalue =& i_value

4、 你知道const 常量如何初始化吗?


⑨sizeof

1、  对于字符数组,strlen 和 sizeof 的值是否相同?

2、  S izeof本质上是函数还是宏?

3、  S izeof的返回值是什么类型?


⑩指针

1、  “int *p; ” &p , p , *p 他们的值分别表示什么含义?

2、  你定义的指针初始化了没?

3、  你理解指针的指针的概念吗?你会使用吗?

4、  “int *pi_value;   pi_value  = 0x100000; ” pi_value + 1 的值是是多少?

5、  你会定义函数指针吗?

6、  你会使用函数指针调用函数吗?

7、  关于指针和数组,请参见知识点数组。


11.动态分配内存

1、  动态分配的内存是保存在什么地方的?

2、  什么情况下使用动态分配内存?

3、  动态申请内存一定要释放,否则会内存泄露。你是否使用过内存检测工具?


12.函数

1、  如何查看函数在内存中的地址?

2、  如何给一个函数指针赋值?

3、  你是否会定义可变入参函数

4、  你是否可以区分函数的形参与实参?

5、  如何定义函数名,以准确的表达函数的用途?

6、  你是否使用const 来修饰函数入参和返回值,以表的特定的含义?

7、  递归如何使用?


13.变量

1、  全局变量,局部变量,常量分别保存在内存中的什么地方?

2、  不同类型的变量,你是否知道其作用域?

3、  全局变量和局部变量是否可以重名?你是否在这样做?

4、  局部变量在函数退出后是否有效,为什么?

5、  全局变量为什么不允许定义在头文件中?有何危害?


14.连接(Linux)

1、  链接位于编译过程的那个阶段?

2、  动态链接库和静态链接库使用时有何区别?

3、  如何 对 动态链接库 进行 动态加载 (不用重启程序而加载链接库)?

4、  动态链接有何优点?

5、  动态链接库中是否定义了非static 的全局变量?你是否知道这是一个非常危险的动作?

6、  动态库中的全局变量(非static )和函数(非 static )是否可以和上层全局变量和函数重名?重名后会发生什么事情?


15.运行时的数据结构(Linux)

1、 你知道什么是段的概念吗?

2、 可执行程序可以分为几个段?每个段保存的是什么内容?

3、 如何查看可执行程序各个段的大小?

4、 当函数被调用时发生了什么?

5、 你有没有试过程序的栈空间最大有多大?程序超过此大小会发生什么?

6、 你使用的系统的栈是向下生长的,还是向上生长的?


16.Include

1、 如何避免对同一头文件的多次include ?


17.声明

1、 什么是 声明 ,什么是定义?

2、 你是否会运用c 语言声明的优先级规则?


18.关于 复杂度 :

1、 软件的首要技术使命 是 管理复杂度。

2、 优秀程序员的 一个特质 是将复杂的事情简单化,而非将简单的问题复杂化。所以,他们一般会选择简单的解决方案。

3、 极尽机巧,复杂的解决方案,除了将新手搞得晕头转向之外,别无他用。

4、 阅读优秀程序员的代码,是一种享受,你很少遇到思维的阻力,你可以尽情的享受简单之美。

### 回答1: 当然可以! C语言学习计划: 1. 了解C语言的基础概念,例如变量、数据类型、运算符、控制结构等。 2. 练习编写简单的C程序,如输入输出、计算、循环等。 3. 了解C语言的函数、数组、指针等高级概念。 4. 练习编写复杂的C程序,如文件读写、数据结构等。 5. 尝试解决一些真实问题,如数学问题、图形学问题等。 实战例题: 1. 编写一个程序,计算n个数的平均值。 2. 编写一个程序,求一个数列的最大值、最小值、和。 3. 编写一个程序,把一个数列从小到大排序。 4. 编写一个程序,实现文件的复制。 5. 编写一个程序,解决汉诺塔问题。 希望这些能对您有所帮助! ### 回答2: 当然可以帮你制定一个C语言学习计划!首先,你需要先了解C语言的基础知识,包括变量、数据类型、运算符、控制流程等。你可以从一些入门教程或者教材中学习这些基础内容。 接下来,建议你学习C语言的函数、数组、指针等高级特性。这些内容是C语言编程中非常重要的一部分,对于理解和编写复杂的程序非常有帮助。 另外,你还需要学习C语言的文件操作、结构体、动态内存分配等内容,这些对于处理文件、管理大量数据非常有用。 在学习过程中,多动手实践是非常重要的。你可以尝试编写各种不同类型的程序,从简单的输出Hello World开始,逐渐提升难度,例如编写运算、字符串处理、排序算法等程序。 此外,你还可以参与一些C语言编程竞赛或者加入一些编程交流社区,通过与其他人交流学习,提升你的编程能力。 以下是一些可以用来练习的实战例题: 1. 编写一个程序,计算并输出输入的两个整数的和、差、积、商和余数。 2. 编写一个程序,输入一个整数n,计算并输出1到n的累加和。 3. 编写一个程序,输入一个整数n,判断n是否是素数(只能被1和自身整除的正整数)。 4. 编写一个程序,输入一个字符串,判断其是否是回文字符串(正读和反读都一样的字符串)。 5. 编写一个程序,输入一个整数n,输出n的阶乘。 6. 编写一个程序,输入一个字符串,统计并输出其中每个字符出现的次数。 7. 编写一个程序,输入一个字符串,将其中的大写字母转换为小写字母,并输出转换后的结果。 8. 编写一个程序,输入一个整数n,输出斐波那契数列的前n个数。 希望以上的回答对你有所帮助,祝你学习C语言顺利! ### 回答3: 当然可以帮您制定一个C语言学习计划,帮助您更好地掌握C语言。以下是一个建议的学习计划: 1. 学习基础知识:首先,您需要学习C语言的基本语法规则、数据类型、运算符和控制语句等基础知识。可以通过阅读相关书籍、在线教程或参加培训课程来学习。 2. 实践编程:学习理论知识后,最好能够进行实践编程。您可以使用C编译器(如GCC或Clang)和相关的集成开发环境(如Code::Blocks或Dev-C++)来编写C语言代码并进行调试。 3. 解决问题:通过解决一些实际问题来加深对C语言的理解。可以从简单的问题开始,逐渐提高难度,例如编写一个计算器程序、实现一个简单的游戏或者处理一些常见数据结构。 4. 阅读源代码:阅读一些经典的C语言程序或开源项目的源代码,可以帮助您了解到真实的C语言应用场景和代码规范。您可以选择一些广受认可的项目,如Linux内核、SQLite数据库等。 5. 学习高级特性:当您熟悉了基本的C语言知识后,可以深入学习一些高级特性,如指针、动态内存管理、文件操作等。这些特性对于掌握C语言编程更为深入和灵活非常有帮助。 至于实战例题,以下是一些推荐的C语言例题: 1. 实现冒泡排序算法。 2. 编写程序,统计字符串中每个字符出现的次数。 3. 实现一个简单的链表数据结构,并进行增删查改操作。 4. 编写程序,将一个整数矩阵进行转置。 5. 实现一个简单的计算器程序,可以进行加减乘除运算。 以上只是一些基础的实战例题,您可以根据自己的学习进度和兴趣进行扩展和深化。希望对您的学习有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值