展开全部

主编推荐语

C语言零基础者学习必备参考!包含一系列C语言必备知识点。

内容简介

本书是学习C语言的入门书籍,内容非常全面,包含C语言基础知识、流程控制、数组、函数、指针、字符串、结构体、链表、文件操作、栈和队列、自定义头文件、多文件编译、Linux下C文件的编译和链接、链接库等知识点。

本书并不单纯讲解理论,还配有大量的程序,每个知识点都结合程序解讲。这样读者理解起来更加容易,也能够在遇到实际问题时进行编程。本书主要针对学习C语言的初学者,即使完全没有编程基础,也能够通过阅读本书快速掌握C语言的核心知识。

目录

  • 版权信息
  • 前言
  • 第1章 为什么要学习C语言
  • 1.1 C的起源和发展
  • 1.1.1 计算机语言发展的三个阶段
  • 1.1.2 语言运行速度的比较
  • 1.1.3 C语言的演变过程
  • 1.2 C的特点
  • 1.2.1 C语言的优点
  • 1.2.2 C语言的缺点
  • 1.3 C的应用领域
  • 1.4 C的重要性
  • 1.5 本章总结
  • 第2章 怎样学习C语言
  • 2.1 学习C语言的心得
  • 2.2 学习C语言的目标
  • 2.3 常见问题答疑
  • 2.3.1 学习Java之前为什么建议先学C语言
  • 2.3.2 没学过计算机专业课程能够学懂C语言吗
  • 2.3.3 英语和数学不好能学好C语言吗
  • 2.4 本章总结
  • 第3章 Microsoft Visual C++6.0的使用
  • 3.1 为什么要学习VC++6.0
  • 3.2 如何创建编程文件
  • 3.3 编写一个最简单的程序
  • 3.4 要养成时刻保存的习惯
  • 3.5 编译–链接–执行
  • 3.6 怎样运行第二个程序
  • 3.7 编译–链接–执行时保存路径下的文件夹有什么变化
  • 3.8 如何编写多文件程序
  • 3.9 如何用VC++6.0调试程序
  • 3.10 本章总结
  • 第4章 从一个程序走进C语言
  • 第5章 预备知识
  • 5.1 CPU、内存、硬盘、显卡、主板、显示器之间的关系
  • 5.1.1 电影是如何运行的
  • 5.1.2 CPU为什么不能直接操作硬盘却能直接操作内存
  • 5.1.3 内存的速度为什么比硬盘的速度快
  • 5.1.4 为什么不将内存造得跟硬盘一样大
  • 5.1.5 CPU是如何操作内存的
  • 5.1.6 主板的作用
  • 5.2 HelloWorld程序是如何运行起来的
  • 5.3 字节
  • 5.3.1 什么是字节
  • 5.3.2 字节换算
  • 5.3.3 小结
  • 5.4 进制
  • 5.4.1 什么是进制
  • 5.4.2 进制转换口算法
  • 5.4.3 进制转换公式法
  • 5.4.4 人类为什么最习惯用十进制
  • 5.4.5 计算机为什么用的是二进制
  • 5.4.6 小结
  • 5.5 数据类型
  • 5.5.1 数据类型的分类
  • 5.5.2 基本数据类型及其所占的字节数
  • 5.6 常量
  • 5.6.1 整型常量
  • 5.6.2 浮点型常量
  • 5.6.3 字符型常量
  • 5.7 常量是以什么样的二进制代码存储在计算机中的
  • 5.8 补码
  • 5.8.1 原码和反码
  • 5.8.2 补码的两个核心问题
  • 5.8.3 int型变量所能存储的范围
  • 5.8.4 int型和char型变量是如何相互赋值的
  • 5.9 什么是ASCII
  • 5.10 变量
  • 5.10.1 如何定义变量
  • 5.10.2 变量的本质
  • 5.10.3 为什么要使用变量
  • 5.10.4 变量的命名规则
  • 5.10.5 为什么必须要初始化变量
  • 5.10.6 小结
  • 5.11 各类型数据之间的混合运算
  • 5.12 代码规范化
  • 5.12.1 代码如何写才能规范
  • 5.12.2 代码规范化的好处
  • 5.12.3 代码规范化的七大原则
  • 5.12.4 小结
  • 5.13 本章总结
  • 第6章 printf的用法
  • 6.1 printf的格式
  • 6.2 输出控制符
  • 6.3 %x、%X、%#x、%#X的区别
  • 6.4 如何输出“%d”、“\”和双引号
  • 6.5 本章总结
  • 第7章 scanf的用法
  • 7.1 概述
  • 7.2 使用scanf的注意事项
  • 7.2.1 参数的个数一定要对应
  • 7.2.2 输入的数据类型一定要与所需要的数据类型一致
  • 7.2.3 在使用scanf之前使用printf提示输入
  • 7.3 本章总结
  • 第8章 运算符和表达式
  • 8.1 算术运算符
  • 8.2 关系运算符
  • 8.3 逻辑运算符
  • 8.4 赋值运算符
  • 8.5 运算符的优先级
  • 8.6 本章总结
  • 第9章 选择结构程序设计
  • 9.1 流程控制
  • 9.1.1 什么是流程控制
  • 9.1.2 流程控制的分类
  • 9.2 选择执行的定义和分类
  • 9.3 if语句
  • 9.3.1 if的最简单用法
  • 9.3.2 if的控制范围问题
  • 9.3.3 if…else的用法
  • 9.3.4 if…else if…else的用法
  • 9.3.5 练习——求分数的等级
  • 9.3.6 练习——三个整数从小到大排序
  • 9.3.7 if的常见问题解析
  • 9.4 switch语句
  • 9.5 本章总结
  • 第10章 循环控制
  • 10.1 循环执行的定义和分类
  • 10.2 for循环
  • 10.2.1 for语句的格式
  • 10.2.2 自增和自减
  • 10.2.3 for循环编程练习
  • 10.2.4 for和if的嵌套使用
  • 10.2.5 强制类型转换
  • 10.2.6 浮点数的存储所带来的问题
  • 10.2.7 for循环的嵌套使用
  • 10.2.8 for循环嵌套编程练习
  • 10.3 while循环
  • 10.3.1 while的执行顺序
  • 10.3.2 while和for的比较
  • 10.3.3 如何看懂一个程序——“试数”
  • 10.3.4 do…while
  • 10.3.5 break和continue
  • 10.4 清空输入缓冲区
  • 10.4.1 输入缓冲区
  • 10.4.2 %d和%c读取缓冲区的差别
  • 10.4.3 用scanf吸收回车
  • 10.4.4 getchar()
  • 10.4.5 fflush(stdin)
  • 10.5 本章总结
  • 第11章 数组
  • 11.1 一维数组的使用
  • 11.1.1 一维数组的定义
  • 11.1.2 一维数组的初始化
  • 11.1.3 一维数组元素的引用
  • 11.1.4 如何将数组a赋给数组b
  • 11.1.5 如何编程获取数组的长度
  • 11.1.6 练习
  • 11.1.7 宏定义:#define
  • 11.1.8 小结
  • 11.2 数组倒置算法
  • 11.3 数组查找算法
  • 11.3.1 顺序查找
  • 11.3.2 折半查找
  • 11.4 数组插入、删除算法
  • 11.4.1 插入算法
  • 11.4.2 删除算法
  • 11.5 数组排序算法
  • 11.5.1 冒泡排序
  • 11.5.2 插入排序
  • 11.5.3 选择排序
  • 11.5.4 快速排序
  • 11.5.5 四种排序算法的比较
  • 11.6 二维数组的使用
  • 11.6.1 二维数组的定义
  • 11.6.2 二维数组的初始化
  • 11.6.3 二维数组如何输出
  • 11.6.4 练习——杨辉三角
  • 11.6.5 是否存在多维数组
  • 11.7 本章总结
  • 第12章 函数
  • 12.1 概述
  • 12.1.1 什么是函数
  • 12.1.2 C程序的组成和编译单位
  • 12.1.3 库函数和自定义函数
  • 12.1.4 函数的调用
  • 12.2 为什么需要函数
  • 12.3 有参函数
  • 12.3.1 有参函数定义的一般形式
  • 12.3.2 形参和实参
  • 12.3.3 主调函数中对被调函数的声明
  • 12.3.4 定义函数时应指定返回值类型
  • 12.3.5 函数的返回值
  • 12.3.6 return是如何将值返回给主调函数的
  • 12.3.7 函数的命名规则
  • 12.3.8 练习——判断一个自然数是否是素数
  • 12.4 函数的递归调用
  • 12.4.1 什么是递归
  • 12.4.2 使用递归必须要满足的两个条件
  • 12.4.3 如何学习递归
  • 12.4.4 递归和循环的关系
  • 12.4.5 递归的优缺点
  • 12.4.6 练习——用递归求n的阶乘
  • 12.4.7 练习——用递归实现1+2+3+…+100的和
  • 12.4.8 练习——用递归求斐波那契数列
  • 12.4.9 练习——用递归求两个数的最大公约数
  • 12.4.10 小结
  • 12.5 数组名作为函数参数
  • 12.6 变量的作用域和存储方式
  • 12.6.1 局部变量
  • 12.6.2 全局变量
  • 12.6.3 为什么不建议使用全局变量
  • 12.6.4 自动变量(auto)
  • 12.6.5 静态变量(static)
  • 12.6.6 寄存器变量(register)
  • 12.6.7 外部变量(extern)
  • 12.7 本章总结
  • 第13章 指针
  • 13.1 指针的重要性
  • 13.2 地址和指针的概念
  • 13.3 指针和指针变量
  • 13.3.1 指针变量的定义
  • 13.3.2 指针变量的初始化
  • 13.3.3 指针常见错误
  • 13.4 指针作为函数参数
  • 13.4.1 互换两个数
  • 13.4.2 函数参数传指针和传数据的区别
  • 13.4.3 定义只读变量:const
  • 13.4.4 用const修饰指针变量时的三种效果
  • 13.5 指针和一维数组的关系
  • 13.5.1 用指针引用数组元素
  • 13.5.2 指针的移动
  • 13.5.3 指针变量的自增运算
  • 13.5.4 两个参数确定一个数组
  • 13.5.5 指针变量占多少字节
  • 13.6 函数、数组、指针相结合的程序练习
  • 13.7 动态内存分配
  • 13.7.1 传统数组的缺点
  • 13.7.2 malloc函数的使用(一)
  • 13.7.3 malloc函数的使用(二)
  • 13.7.4 free函数的使用
  • 13.7.5 练习——动态数组的构建
  • 13.7.6 动态数组长度的扩充和缩小
  • 13.7.7 静态内存分配和动态内存分配小结
  • 13.7.8 多级指针
  • 13.7.9 跨函数使用动态内存
  • 13.8 通过指针引用二维数组
  • 13.8.1 二维数组元素的地址
  • 13.8.2 二维数组的首地址和数组名
  • 13.8.3 练习
  • 13.9 函数指针
  • 13.9.1 什么是函数指针
  • 13.9.2 如何用函数指针调用函数
  • 13.10 本章总结
  • 第14章 字符串
  • 14.1 字符串常量
  • 14.2 不能将一个字符串常量赋给一个字符变量
  • 14.3 字符数组
  • 14.3.1 字符数组的定义
  • 14.3.2 字符数组的初始化
  • 14.3.3 初始化内存函数:memset()
  • 14.3.4 用scanf输入字符串
  • 14.4 字符串与指针
  • 14.5 如何用scanf给字符指针变量所指向的内存单元初始化
  • 14.6 字符串处理函数
  • 14.6.1 字符串输入函数gets()
  • 14.6.2 优先使用fgets()函数
  • 14.6.3 使用gets()和fgets()前注意吸收回车
  • 14.6.4 练习——判断字符串是否是回文字符串
  • 14.6.5 练习——将字符串中的小写字母转换成大写字母
  • 14.6.6 字符串输出函数puts()
  • 14.6.7 字符串输出函数fputs()
  • 14.6.8 字符串复制函数strcpy()
  • 14.6.9 字符串复制函数strncpy()
  • 14.6.10 内存拷贝函数memcpy()
  • 14.6.11 sprintf()
  • 14.6.12 字符串比较函数strcmp()
  • 14.7 本章总结
  • 第15章 自定义数据类型——结构体
  • 15.1 为什么需要结构体
  • 15.2 定义和使用结构体变量
  • 15.2.1 声明结构体类型
  • 15.2.2 定义结构体类型变量
  • 15.2.3 结构体变量可进行哪些运算
  • 15.2.4 结构体变量的初始化——定义时初始化
  • 15.2.5 结构体变量的引用
  • 15.2.6 结构体变量的初始化——先定义后初始化
  • 15.2.7 结构体字节对齐
  • 15.3 结构体数组
  • 15.3.1 结构体数组的定义和引用
  • 15.3.2 结构体数组定义时初始化
  • 15.4 结构体指针
  • 15.4.1 指向结构体变量的指针
  • 15.4.2 指向结构体数组的指针
  • 15.5 结构体变量和结构体指针变量作为函数参数
  • 15.6 练习——动态构造存放学生信息的结构体数组
  • 15.7 本章总结
  • 第16章 链表
  • 16.1 为什么要学习链表
  • 16.1.1 数组的缺陷
  • 16.1.2 链表的优点
  • 16.2 链表的缺点
  • 16.3 链表相关术语
  • 16.4 链表的定义和分类
  • 16.4.1 链表的定义
  • 16.4.2 链表的分类
  • 16.5 编写一个链表程序
  • 16.6 练习——插入结点
  • 16.7 练习——删除结点
  • 16.8 练习——销毁链表
  • 16.9 链表排序算法
  • 16.9.1 如何互换结点
  • 16.9.2 链表冒泡排序
  • 16.9.3 链表插入排序
  • 16.9.4 链表选择排序
  • 16.9.5 链表快速排序
  • 16.9.6 链表排序小结
  • 16.10 单循环链表
  • 16.11 双向链表
  • 16.12 typedef的用法
  • 16.13 本章总结
  • 第17章 栈
  • 17.1 内存的分区
  • 17.2 线性表
  • 17.3 栈的定义
  • 17.4 栈的基本操作
  • 17.5 链栈程序演示
  • 17.6 栈的应用
  • 17.7 本章总结
  • 第18章 队列
  • 18.1 队列的定义
  • 18.2 顺序队列
  • 18.3 链式队列的基本操作
  • 18.4 链式队列程序演示
  • 18.5 队列的应用
  • 18.6 本章总结
  • 第19章 文件操作
  • 19.1 文件概述
  • 19.1.1 文件的定义
  • 19.1.2 文件的分类
  • 19.2 文件类型指针变量
  • 19.3 文件的打开
  • 19.3.1 打开文件
  • 19.3.2 文件的使用方式
  • 19.3.3 练习——打开文件
  • 19.4 文件的关闭
  • 19.5 文件读写函数概述
  • 19.6 fgetc()和fputc()
  • 19.6.1 fputc()
  • 19.6.2 fgetc()
  • 19.6.3 fgetc()程序举例
  • 19.6.4 fgetc()和fputc()结合程序举例
  • 19.6.5 如何判断文件是否为空
  • 19.7 fgets()和fputs()
  • 19.7.1 fgets()
  • 19.7.2 fputs()
  • 19.8 移动文件位置指针:fseek()和rewind()
  • 19.8.1 fseek()
  • 19.8.2 rewind()
  • 19.9 格式化读写函数:fprintf()和fscanf()
  • 19.10 数据块读写函数:fread()和fwrite()
  • 19.10.1 fwrite()函数
  • 19.10.2 fread()函数
  • 19.10.3 ftell()
  • 19.10.4 如何用fread()和fwrite()删除文件中的数据块
  • 19.10.5 练习——登录程序
  • 19.11 本章总结
  • 第20章 头文件
  • 20.1 程序是如何编译生成可执行文件的
  • 20.2 概述
  • 20.2.1 什么是头文件
  • 20.2.2 头文件的作用
  • 20.2.3 什么样的内容适合放在头文件中
  • 20.3 “#include<>”和“#include""”的区别
  • 20.4 如何自定义头文件
  • 20.4.1 头文件的组成部分
  • 20.4.2 #ifndef/#define/#endif
  • 20.5 本章总结
  • 第21章 位操作运算符
  • 21.1 按位与(&)
  • 21.2 按位或(|)
  • 21.3 按位异或(^)
  • 21.4 左移运算符(<<)
  • 21.5 右移运算符(>>)
  • 21.6 本章总结
  • 附录A gcc编译工具的使用
  • 附录B make自动化编译工具的使用
  • 附录C gdb调试工具的使用
  • 附录D 链接库
  • 附录E 运算符的优先级和结合性
  • 常用ASCII码表
展开全部

评分及书评

4.8
13个评分
  • 用户头像
    给这本书评了
    5.0
    尝试与计算机沟通1.00

    缘起:“程序是写出来的,不是看书看出来的!” 要 “敲代码”,必学盲打!盲打是学习编程最基本的技能。要学会记笔记。编程需要不断地积累。我们一定要学会模仿别人优秀的代码、优秀的算法,然后将它记下来。一定要站在巨人的肩膀上学习。但是我们的记忆能力是有限的,时间长了难免会遗忘,所以一定要学会记笔记。一有心得、体会、感悟就写下来,这些都是很珍贵的。我们在记笔记的时候,如果眼前没有计算机则可以先写在纸上,但事后一定要将它整理成电子版。整理成电子版看起来会很方便、舒适,还可以随意地增添和删改,保存时间也长。感受:开始尝试和计算机沟通。

      转发
      评论
      用户头像
      给这本书评了
      5.0
      非常适合计算机二级自学同学

      这本书真的就是字如其名,手把手啊,我的天 (扶额),讲的真的很清楚很细致,每一个问题和细节都讲了。真的很适合我们这些考生 amen,爱得到,爱这本书。抱歉我不接受别人说这本书不好,别跟我评价说哪哪更好,这本书就是绝美,杠我你必 s

        转发
        评论
        用户头像
        给这本书评了
        5.0
        《手把手教你学C语言》

        学习 C 语言的过程,对我来说,不仅仅是一种技术上的精进,更是一次思维方式和问题解决能力的深度锤炼。以下是我对 C 语言学习的一些感悟:底层思维的培养:C 语言以其接近硬件的特性,让我深刻体会到计算机底层运作的奥秘。它教会我如何从最基本的内存管理、数据处理出发,去构建复杂的程序逻辑。这种底层思维的培养,对于理解计算机科学的其他领域,如操作系统、计算机网络等,都大有裨益。C 语言的学习,让我深刻体会到基础知识的重要性。无论是变量、数据类型、运算符还是控制结构,这些基础知识都是构建更复杂程序的基础。只有打好基础,才能在后续的编程中游刃有余。掌握内存管理和指针操作是 C 语言学习的难点,但也是理解计算机如何存储和处理数据的关键。C 语言是一种简洁而强大的编程语言,它让我体会到了编程的精髓。通过学习 C 语言,我理解了内存管理的重要性,以及指针的魔力和危险。C 语言的低级特性让我能够更接近硬件,理解程序是如何在计算机上运行的。此外,C 语言的结构化编程概念,如函数、循环和条件语句,为我打下了良好的编程基础。尽管现代编程语言提供了更多的抽象和便利,但 C 语言的控制力和效率仍然让它在系统编程和嵌入式开发中占据着不可替代的地位。严谨性的要求:C 语言是一种强类型语言,它对变量的类型、内存的使用都有严格的要求。这种严谨性让我意识到,在编程中,每一个细节都至关重要。一个小小的错误,如类型不匹配、内存未释放等,都可能导致程序崩溃或运行异常。因此,在编写代码时,必须保持高度的专注和严谨。学习 C 语言是一次对计算机科学基础的深刻探索。它教会了我如何与计算机硬件直接对话,理解内存管理、指针操作和数据结构的重要性。通过编写 C 语言程序,我学会了如何将复杂问题分解为可管理的小部分,并逐步解决。C 语言的严谨性和对细节的关注也让我意识到编程不仅仅是一种技能,更是一种思维方式。此外,C 语言的跨平台特性让我了解到代码的可移植性和效率之间的平衡。总之,学习 C 语言不仅提升了我的编程能力,也加深了我对计算机工作原理的理解。 解决问题的能力:学习 C 语言的过程中,我遇到了许多难题,如指针的复杂用法、内存管理的困扰等。但正是这些挑战,锻炼了我解决问题的能力。我学会了如何查阅文档、搜索资料,如何运用逻辑思维去分析问题、拆解问题,并找到解决方案。C 语言的学习让我学会了如何以编程的视角去解决问题。面对一个问题,我会先思考它的逻辑结构,然后设计算法,最后编写代码。这种思维方式不仅提高了我的编程能力,也让我在日常生活中更加善于思考和解决问题。持续学习的态度:C 语言是一门博大精深的编程语言,其涉及的领域广泛,包括数据结构、算法、操作系统等。在学习过程中,我逐渐意识到,编程不仅仅是一种技能,更是一种持续学习和探索的过程。只有保持对新技术、新知识的渴望和好奇心,才能在编程的道路上不断前行。C 语言只是编程世界中的冰山一角。通过学习 C 语言,我意识到编程是一个持续学习和不断进步的过程。无论是学习新的编程语言、掌握新的编程技术,还是了解计算机底层的工作原理,都需要不断地学习和探索。这种持续学习的态度,不仅让我在编程领域不断进步,也让我在人生道路上更加充实和自信。编程是一门实践性很强的学科。通过不断地编写代码、调试程序,我逐渐掌握了 C 语言的语法和逻辑。同时,我也学会了反思和总结,每次遇到问题,我都会思考问题的根源,并尝试找出解决方法。这种反思和总结的习惯,不仅提高了我的编程效率,也让我在编程中更加自信和从容。团队协作的价值:虽然 C 语言的学习主要是个人努力的过程,但在解决复杂问题或参与项目时,团队协作的价值就凸显出来了。通过与他人交流和合作,我可以学到不同的解题思路和方法,拓宽自己的视野。同时,团队协作也培养了我的沟通能力和责任感。对 C 语言的了解以及认知:首先,C 语言是一种低级语言,它提供了对内存和硬件的直接控制。这使得 C 语言在系统编程和嵌入式开发中非常有用,但同时也意味着程序员需要更加小心地管理内存,避免内存泄漏和指针错误。其次,C 语言缺乏现代编程语言中常见的高级抽象和安全特性。例如,C 语言没有内置的垃圾回收机制,也没有丰富的数据结构和算法库。因此,程序员需要自己实现这些功能,这增加了编程的复杂性和出错的可能性。再者,C 语言的标准库相对较小,这意味着许多常见的任务需要程序员自己编写代码来完成。虽然这提供了很大的灵活性,但也可能导致代码的重复和维护问题。最后,C 语言的语法相对简洁,但这也意味着它缺乏一些现代语言的语法糖,如自动类型推导和异常处理。这可能会使代码更难以阅读和理解,特别是对于初学者来说。综上所述,C 语言是一种功能强大但需要谨慎使用的编程语言。在使用 C 语言时,程序员需要具备良好的内存管理能力和对底层细节的深入理解。尽管如此,C 语言仍然是学习计算机科学和软件开发的重要基础。总之,指针是 C 语言中的一大特色,也是一大挑战。它让我理解了计算机内存的工作原理,也让我意识到编程中的每一个细节都至关重要。掌握指针,不仅提高了我的编程能力,更让我对计算机底层有了更深入的了解。学习 C 语言是一段充满挑战和收获的旅程。它不仅让我掌握了编程的基本技能和思维方式,更让我对计算机底层有了更深入的了解。我相信,这段经历将对我未来的学习和工作产生深远的影响。

          转发
          评论
        • 查看全部5条书评

        出版方

        机械工业出版社有限公司

        机械工业出版社是全国优秀出版社,自1952年成立以来,坚持为科技、为教育服务,以向行业、向学校提供优质、权威的精神产品为宗旨,以“服务社会和人民群众需求,传播社会主义先进文化”为己任,产业结构不断完善,已由传统的图书出版向着图书、期刊、电子出版物、音像制品、电子商务一体化延伸,现已发展为多领域、多学科的大型综合性出版社,涉及机械、电工电子、汽车、计算机、经济管理、建筑、ELT、科普以及教材、教辅等领域。