当前位置:主页 > 计算机电子书 > C++ > C语言技术下载
C语言核心技术(第2版)

C语言核心技术(第2版) PDF 超清版

  • 更新:2024-04-01
  • 大小:138 MB
  • 类别:C语言技术
  • 作者:彼得·普林茨
  • 出版:机械工业出版社
  • 格式:PDF

  • 资源介绍
  • 相关推荐

C语言核心技术(第2版)》是一本经典的O’Reilly参考书,对于C语言及其运行库中的每个特性给予了清晰、详细的解释,无论是多线程还是泛型宏,甚至是C11标准中的新功能,都被全面涵盖,无论你是初学者还是有经验的开发者,这本书都是一个宝贵的资源,它不仅能帮助你深入理解C语言的基础知识,还能带领你掌握更高级的编程技术,无论是作为学习材料还是作为参考书,这本新版的书都是必不可少的。

C语言核心技术电子书封面

读者评价

不值这么多钱,内容没有深度,入门的书,就是前面330页是讲语法,后面100页是讲c编译,中间300多页是函数库函数介绍,质量比不是上《c和指针》或《c primer plus》

叙述c语言还多知识,配合C学习书籍C primer plus还是很不错的。

增加了C11很多新特性,确实是一部集大成的工具书。

不一定是说有C语言基础的看,有其他语言基础的看这个会比看C语言入门要舒服很多

参考手册类型,应该很全面吧,一些比较冷门的知识都有讲,以前都是上网查的。不过讲的很简略。

内容介绍

这本新版的经典O’Reilly参考书,对于C语言及其运行库中的每个特性给予了清晰、详细的解释,包括多线程、泛型宏,以及其他2011年C语言标准(C11)中的新功能。如果您想理解一个陌生函数的作用,以及标准链接库是如何规范它的执行,您可以在本书中找到答案。对于有经验的C与C++程序员,这本书也相当适用,它包含了GNU软件工具集中常用工具的使用说明。您将会学到如何使用GNUmake创建C程序,从C源代码编译获得执行程序,以及使用GNU调试器对程序进行测试与调试。

目录

  • 前言 1
  • 第一部分 语言
  • 第1章 C语言基础 11
  • 第2章 数据类型 29
  • 第3章 字面量 43
  • 第4章 类型转换 53
  • 第5章 表达式和运算符 69
  • 第6章 语句 100
  • 第7章 函数 114
  • 第8章 数组 129
  • 第9章 指针 140
  • 第10章 结构、联合与位字段 157
  • 第11章 声明 173
  • 第12章 动态内存管理 190
  • 第13章 输入和输出 205
  • 第14章 多线程 233
  • 第15章 预处理命令 253
  • 第二部分 标准库
  • 第16章 标准头 273
  • 第17章 函数简介 308
  • 第18章 标准库函数 333
  • 第三部分 基本工具
  • 第19章 使用GCC编译C程序 673
  • 第20章 使用make构建C程序 698
  • 第21章 使用GDB调试C程序 733
  • 第22章 使用IDE 767

资源下载

资源下载地址1:https://pan.quark.cn/s/0341025fb1b0

相关资源

网友留言

网友NO.43303
田修洁

C是很小的内核语言,并包含极少的硬件相关元素,可以说具有相当高的可移植性。比方说,C语言不提供有关文件操作或动态内存管理等语句。事实上,甚至不直接提供控制台输出和输入语句。C语言的做法是是使用扩充的标准C链接库,为各式各样的编程目的提供各种所需的函数。 因为C是专门作为“系统编程”而开发的,它目前主要的用途之一就是编写”嵌入式系统程序“,这一点不会让我们感到惊讶。许多开发者把C当作可移植的,结构化的高级程序语言,以编写诸如文字处理器、数据库以及图形应用程序。 第7章 函数 一个源文件就是一个翻译单元。前面说过#include指令只是将文件的内容插入到#include指令的位置,比如这样的代码也是可以的:#include "mydoc.txt"或者#include "mycsource.c"但是这样写出的代码有点怪异,所以这里我们按照一般的概念,编译源文件(.c文件),#include头文件(.h文件)。确切的说,一个翻译单元就是一个源文件和它include的头文件。一个翻译单元编译成一个目标文件,最后将多个翻译单元连接起来生成一个完整的可执行程序。 1. inline函数 和其他函数不同的是,翻译单元只要用到某个inline函数,就必须重复定义此inline函数,编译器必须准备好此函数,以便插入inline的程序代码,因此,inline函数定义经常被写入在头文件中。 如果翻译单元内的某个函数的所有声明都具有inline修饰符,而没有extern修饰符,那么此函数是inline的。inline定义特别针对翻译单元,它不构成外部的定义,因此别的翻译单元可以包含此函数的外部定义。如果有外部定义附加到inline定义中,那么编译器可以只有选择要使用哪一种定义。 如果使用存储类修饰符extern来声明一个被定义成inline的函数,那么此函数的定义就会是外部的(external)。 然而从别的翻译单元调用函数,将不会被编译成inline。inline函数其实就是一般的函数,只不过在机器码中被调用的方式不同。和一般的函数一样,inline函数具有自己的地址。如果inline函数使用到宏,此处也是展开宏。然而,在没有被声明为static的inline函数,你不应该以静态生存周期的方式来定义可修改的对象。 2. 可选性自变量 这是C语言中对于具有可变参数的函数的支持。 具体要使用这些可变的参数的时候,必须通过一个类型为va_list的对象,它包含了这些参数。该类型定义在stdarg.h中。 可以使用stdarg.h中的4个宏来处理这个指针。 void va_start(va_list argptr,lasparam) type va_arg(va_list argptr,type) void va_end(va_list argptr) void va_copy(va_list dest,va_list src)

网友NO.30613
姜兴贤

在表达式使用标示符之前,编译器需要知道此标示符的所有特性,因此,每个翻译单元都必须包含所用到的每个标示符的声明。声明标示符之后,就可以在它的作用域中使用此标示符了。对象和函数的标示符有文件作用域和语句块作用域之分。 存储类型修饰符会改变标示符的链接和相应对象的生存周期。 auto 自动 static\extern 对链接是有影响的同时它们声明的变量具有静态生存周期。 register 声明的变量会被存放在寄存器中,以便快速调用,也因此它不能使用“地址运算符&”。 限定类型符 const \ volatile \ restrict const 指明其为常量,即说明不能通过程序修改。 volatile 说明被声明的对象会被程序以外的事件修改。 restrict 限定对象此时不能被其他方式修改,只能是通过被restrict限定方式。 eg: extern const volatile int ticks ; 此对象无法被程序修改,但是硬件可以。 声明和定义的区别:定义能够使能存分配出相应的空间,而声明不能。标示符的声明次数无限制,但是只有“其作用域内的其中一次”有效。若将“具有外部链接的对象和函数”的定义放在头文件中,就容易造成重复定义。 标示符的声明同时也是定义的情况; 1、 如果在声明的函数的同时出现函数体 eg: int imax(int a,int b); 声明,不是定义        int imax(int a,intb);           {return (a>=b?a;b);} 即使声明又是定义 2、如果在对象声明是给他分配内存 eg: extern double b[]; 声明       int a=2; 声明与定义 复杂声明的解读 ( )  : 返回值的类型为······.的函数 [ ]  :元素类型为······的数组 *  : 指向······类型的指针  步骤: 从标示符开始  1、 如果左圆、方括号出现在紧邻的右边,那边翻译整对括号。  2、否则,如果*号出现在左边,则翻译此星号。反复1,2直到完成。 eg: char  *(*ftab[])(void) 解释:元素类型为指针的数组,这些指针指向参数为void且返回值为指针的函数,此指针指向char型数据。连起来就是,ftab指向一个数组,此数组内的元素为指向返回值为 指向char型数据的指针的函数         float (*func())[3] 解释:返回值为指针的函数,为指向有3个元素的数组的指针,元素类型为float的数组。即:func指向返回值为指向有3个元素且类型为float的数组的函数。 现在说说typedef,它是一个声明,可以提高程序的可移植性与可读性。很多地方说其与#define类似,这是以偏概全的。 typedef int int32 ; 与#define int32 int 是类似的,但是 typedef int  array[10] ; 就很难用define来解释了。 那就先说说typedef int  array[10] ; 如何解释。 先把typedef去掉,即为int  array[10] ;这是一个定义也是一个声明,为10个int元素的数组。然后再加上typedef ,这句typedef int  array[10] ;就仅仅是声明了,但是array这个符号就多了一个用途,可以声明和定义与其去了typedef时所表达相同意思的对象。即array a;即声明和定义了一个 int a[10]的对象。同理如char  *(*ftab[])(void);,若我在其前面加一个typedef,就可以用ftab n,m;来表示char  *(*n[])(void);char  *(*m[])(void);就是这么简单。 做嵌入式的人应该会见到(*(void(*)())0) () 这句,意思是硬件地址跳到0处。但是这个用上面的方法好像解释不了吧..........这当中其实是加入了强制类型转换。按前面的解读,如果需要跳到0处,其实(*0)()就可以了,但是这里的0并不是一个指针呀,*的操作对象必须是指针,因此就对0强制转换为指针咯,用(void(*)())。