当前位置:首页 > C++ >
《C语言解惑:指针 数组 函数和多文件编程》电子书封面

C语言解惑:指针 数组 函数和多文件编程

  • 发布时间:2020年11月23日 09:10:42
  • 作者:刘振安
  • 大小:7.96 MB
  • 类别:C语言电子书
  • 格式:PDF
  • 版本:高清版
  • 评分:8.7

    C语言解惑:指针 数组 函数和多文件编程 PDF 高清版

      给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C语言、指针、数组、函数、多文件编程方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小7.96 MB,刘振安编写,目前豆瓣、亚马逊、当当、京东等电子书综合评分为:8.9分

      Tags:C语言 指针 数组 函数 多文件编程 

      内容介绍

      C语言解惑

      C语言解惑封面

      读者评价

      写得挺不错的,这种书就像是课堂上的好学生写出的笔记一般,基本都是干货和写代码中的各种坑。看完解答了我对C语言的很多疑惑。

      以C语言中核心的函数设计为主线,串联与之相关的指针、数组、函数、多文件编程等难点;以“解惑”作为编写宗旨,启迪读者的编程思维方式,帮助读者快速进化为编程高手

      内容介绍

      本书的前提是读者已经学过C语言,书中将完整、系统地论述各个部分的知识并结合实用程序和趣味游戏程序,综合讲解函数设计、多文件编程和结构化程序设计的方法。本书既可以作为教师、学生及工程技术人员的参考书,也可以作为常备手册。

      内容节选

      C语言编程中函数的基本学习

      C 语言中的函数等价于 Fortran 语言中的子程序或函数,也等价于 Pascal 语言中的过程或函数。函数为计算的封装提供了一种简便的方法,此后使用函数时不需要考虑它是如何实现的。使用设计正确的函数,程序员无需考虑功能是如何实现的,而只需知道它具有哪些功能就够了。在 C 语言中可以简单、方便、高效地使用函数。我们经常会看到在定义后仅调用了一次的短函数,这样做可以使代码段更清晰易读。

      到目前为止,我们所使用的函数(如 printf、getchar 和 putchar 等)都是函数库中提供的函数。现在,让我们自己动手来编写一些函数。C 语言没有像 Fortran 语言一样提供类似于**的求幂运算符,我们现在通过编写一个求幂的函数 power(m, n)来说明函数定义的方法。power(m, n)函数用于计算整数 m 的 n 次幂,其中 n 是正整数。对函数调用 power(2,5)来说,其结果值为 32。该函数并非一个实用的求幂函数,它只能处理较小的整数的正整数次幂,但这对于说明问题已足够了。(标准库中提供了一个计算 xy 的函数 pow(x, y)。)

      下面是函数 power(m, n)的定义及调用它的主程序,这样我们可以看到一个完整的程序结构。

      #include <stdio.h>
      int power(int m, int n);
      
      /* test power function */
      main()
      {
       int i;
       for (i = 0; i < 10; ++i)
       printf("%d %d %d\n", i, power(2,i), power(-3,i));
       return 0;
      }
      
      /* power: raise base to n-th power; n >= 0 */
      int power(int base, int n)
      {
       int i, p;
       p = 1;
       for (i = 1; i <= n; ++i)
       p = p * base;
       return p;
      }
      
      

      函数定义的一般形式为:

      返回值类型 函数名(0 个或多个参数声明)
      {
       声明部分
       语句序列
      }
      

      函数定义可以以任意次序出现在一个源文件或多个源文件中,但同一函数不能分割存放在多个文件中。如果源程序分散在多个文件中,那么,在编译和加载时,就需要做更多的工作,但这是操作系统的原因,并不是语言的属性决定的。我们暂且假定将 main 和 power 这两个函数放在同一文件中,这样前面所学的有关运行 C 语言程序的知识仍然有效。

      main 函数在下列语句中调用了两次 power 函数:printf("%d %d %d\n", i, power(2, i), power(-i, 3)); 每次调用时,main 函数向 power 函数传递两个参数;在调用执行完成时,power 函数向 main 函数返回一个格式化的整数并打印。在表达式中,power(2, i)同 2 和 i 一样都是整数

      power 函数的第一行语句 int power(int base, int n) 声明参数的类型、名字以及该函数返回结果的类型。power 函数的参数使用的名字只在 power 函数内部有效,对其它任何函数都是不可见的:其它函数可以使用与之相同的参数名字而不会引起冲突。变量 i 与 p 也是这样:power 函数中的 i 与 main 函数中的 i 无关。

      我们通常把函数定义中圆括号内列表中出现的变量称为形式参数,而把函数调用中与形式参数对应的值称为实际参数。

      power 函数计算所得的结果通过 return 语句返回给 main 函数。关键字 return 的后面可以跟任何表达式,形式为: return 表达式;

      函数不一定都有返回值。不带表达式的 return 语句将把控制权返回给调用者,但不返回有用的值。这等同于在到达函数的右终结花括号时,函数就“到达了尽头”。主调函数也可以忽略函数返回的值。

      读者可能已经注意到,main 函数的末尾有一个 return 语句。由于 main 本身也是函数,因此也可以向其调用者返回一个值,该调用者实际上就是程序的执行环境。一般来说,返回值为 0 表示正常终止,返回值为非 0 表示出现异常情况或出错结束条件。为简洁起见,前面的 main 函数都省略了 return 语句,但我们将在以后的 main 函数中包含 return 语句,以提醒大家注意,程序还要向其执行环境返回状态。

      出现在 main 函数之前的声明语句 int power(int m, int n); 表明 power 函数有两个 int 类型的参数,并返回一个 int 类型的值。这种声明称为函数原型,它必须与 power 函数的定义和用法一致。如果函数的定义、用法与函数原型不一致,将出现错误。

      函数原型与函数声明中参数名不要求相同。事实上,函数原型中的参数名是可选的,这样上面的函数原型也可以写成以下形式: int power(int, int);

      但是,合适的参数名能够起到很好的说明性作用,因此我们在函数原型中总是指明参数名。

      回顾一下,ANSI C 同较早版本 C 语言之间的最大区别在于函数的声明与定义方式的不同。按照 C 语言的最初定义,power 函数应该写成下列形式:

      /* power: raise base to n-th power; n >= 0 */
      /* (old-style version) */
      power(base, n)
      int base, n;
      {
       int i, p;
       p = 1;
       for (i = 1; i <= n; ++i)
       p = p * base;
       return p;
      }
      
      

      其中,参数名在圆括号内指定,参数类型在左花括号之前声明。如果没有声明某个参数的类型,则默认为 int 类型。函数体与 ANSI C 中形式相同。

      在 C 语言的最初定义中,可以在程序的开头按照下面这种形式声明 power 函数:int power();

      函数声明中不允许包含参数列表,这样编译器就无法在此时检查 power 函数调用的合法性。事实上,power 函数在默认情况下将被假定返回 int 类型的值,因此整个函数的声明可以全部省略。

      在 ANSI C 中定义的函数原型语法中,编译器可以很容易检测出函数调用中参数数目和类型方面的错误。ANSI C 仍然支持旧式的函数声明与定义,这样至少可以有一个过渡阶段。但我们还是强烈建议读者:在使用新式的编译器时,最好使用新式的函数原型声明方式。

      下面给出MFC上的实现:

      void CNowaMagic_MFCDlg::OnBnClickedOk()
      {
       // TODO: 在此添加控件通知处理程序代码
       //CDialogEx::OnOK();
       //获得EDIT 
       CEdit* base;
       CEdit* n;
       base = (CEdit*) GetDlgItem(IDC_EDIT1);
       n = (CEdit*) GetDlgItem(IDC_EDIT2);
      
       CString str1;
       CString str2;
       CString showStr;
      
       char tmp[10] = "";
       base -> GetWindowText(str1);
       n -> GetWindowText(str2);
      
       //char* pstr = (LPTSTR)LPCTSTR(str1); 
       int my_base = _ttoi(str1); 
       int my_n = _ttoi(str2);
      
       int result = power(my_base, my_n);
       
       showStr = itoa(result,tmp,10);
      
       CString str = _T("乘方运算结果为:");
      
       MessageBox(str + showStr,_T("程序运行结果"),MB_OK);
       str.ReleaseBuffer();
      }
      
      int power(int base, int n)
      {
       int i, p;
       p = 1;
       for (i = 1; i <= n; ++i)
       p = p * base;
       return p;
      }
      
      

      程序运行结果:

      2015121142749206.jpg (537×305)

      CString转int可以使用

       int my_base = _ttoi(str1);
      

      函数声明注意要写到头函数中。

      传值调用与参数
      习惯其它语言(特别是 Fortran 语言)的程序员可能会对 C 语言的函数参数传递方式感到陌生。在 C 语言中,所有函数参数都是“通过值”传递的。也就是说,传递给被调用函数的参数值存放在临时变量中,而不是存放在原来的变量中。这与其它某些语言是不同的,比如,Fortran 等语言是“通过引用调用”,Pascal 则采用 var 参数的方式,在这些语言中,被调用的函数必须访问原始参数,而不是访问参数的本地副本。

      最主要的区别在于,在 C 语言中,被调用函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。

      传值调用的利大于弊。在被调用函数中,参数可以看作是便于初始化的局部变量,因此额外使用的变量更少。这样程序可以更紧凑简洁。侧如,下面的这个 power 函数利用了这一性质:

      /* power: raise base to n-th power; n >= 0; version 2 */
      int power(int base, int n)
      {
       int p;
       for (p = 1; n > 0; --n)
       p = p * base;
       return p;
      }
      

      其中,参数 n 用作临时变量,并通过随后执行的 for 循环语句递减,直到其值为 0,这样就不需要额外引入变量 i;power 函数内部对 n 的任何操作不会影响到调用函数中 n 的原始参数值。

      必要时,也可以让函数能够修改主调函数中的变量。这种情况下,调用者需要向被调用函数提供待设置值的变量的地址(从技术角度看,地址就是指向变量的指针),而被调用函数则需要将对应的参数声明为指针类型,并通过它间接访问变量。

      如果是数组参数,情况就有所不同了。当把数组名用作参数时,传递给函数的值是数组起始元素的位置或地址——它并不复制数组元素本身。在被调用函数中,可以通过数组下标访问或修改数组元索的值。

      目录

      • 第1章 引入指针变量
      • 1.1变量的三要素
      • 1.2 变量的操作
      • 1.3 指针变量
      • 1.4 指针类型
      • 1.5 高级指针
      • 第2章 指针基础知识
      • 2.1 指针运算符
      • 2.2 指针移动
      • 2.3 指针地址的有效性
      • 2.4 指针的初始化
      • 2.5 指针相等
      • 2.6 对指针使用const限定符
      • 第3章 一维数组
      • 3.1 一维数值数组
      • 3.2 一维字符串数组
      • 3.3 使用一维数组容易出现的错误
      • 3.3.1 一维数组越界错误
      • 3.3.2 一维数组初始化错误
      • 3.3.3 数组赋值错误
      • 3.3.4 求值顺序产生歧义错误
      • 3.4 综合实例
      • 第4章 指针与数组
      • 4.1 数组与指针的关系
      • 4.2 一维字符串数组与指针
      • 4.3 字符串常量
      • 4.4 指针数组
      • 4.5 配合使用一维数组与指针
      • 4.5.1 使用一维数组名简化操作
      • 4.5.2 使用指针操作一维数值数组
      • 4.5.3 使用一维字符数组
      • 4.5.4 指针初始化实例
      • 4.6 二维数组与指针
      • 4.6.1 二维数组
      • 4.6.2 二维数组操作实例
      • 4.6.3 二维数组与指针
      • 4.6.4 二维数组与指向一维数组的指针
      • 4.6.5 字符串二维数组
      • 4.7 多维数组与指针
      • 4.7.1 多维数组
      • 4.7.2 多维数组与指针
      • 4.7.3 多维数组实例
      • 4.8 综合设计实例
      • 第5章 函数基础知识
      • 5.1 函数
      • 5.1.1 函数和函数原型
      • 5.1.2 函数值和return语句
      • 5.1.3 函数调用形式
      • 5.1.4 函数参数的基础知识
      • 5.1.5 被调用函数的返回位置
      • 5.2 C程序的典型结构
      • 5.2.1 单文件结构
      • 5.2.2 一个源文件和一个头文件
      • 5.2.3 多文件结构
      • 5.3 变量的作用域
      • 5.3.1 单文件里的块结构及函数
      • 5.3.2 单文件多函数的变量
      • 5.3.3 多文件变量作用域
      • 5.4 变量的存储地址分配
      • 5.4.1 单文件变量的存储地址分配
      • 5.4.2 多文件变量的存储地址分配
      • 5.5 main函数原型及命令行参数
      • 第6章 函数设计
      • 6.1 函数设计的一般原则
      • 6.1.1 函数设计基础
      • 6.1.2 函数设计的注意事项
      • 6.1.3 函数的一般结构
      • 6.2 函数的返回值
      • 6.2.1 无返回值的void类型函数
      • 6.2.2非void类型的函数必须返回一个值
      • 6.2.3 函数使用临时变量作为返回值
      • 6.2.4 不能使用临时数组名作为返回值
      • 6.2.5 返回临时指针必须是首地址
      • 6.2.6 返回结构的函数
      • 6.2.7 返回结构指针的函数
      • 6.2.8 返回枚举的函数
      • 6.3 函数参数的传递方式
      • 6.3.1 传数值
      • 6.3.2 传地址值
      • 6.4 函数指针
      • 6.5 理解函数声明
      • 6.5.1 词法分析中的“贪心法”
      • 6.5.2 克服语法“陷井”读懂函数
      • 6.6 函数设计举例
      • 6.6.1 完璧归赵
      • 6.6.2 多余的参数
      • 6.6.3 传递的参数与函数参数匹配问题
      • 6.6.4 等效替换参数
      • 第7章 函数设计实例
      • 7.1 函数设计注意事项
      • 7.1.1 再谈函数的类型和返回值
      • 7.1.2 注意区分使用结构的场合
      • 7.1.3 注意正确地为结构分配内存
      • 7.1.4 不同结构变量的赋值问题
      • 7.1.5 其他注意事项
      • 7.2 正确区分并设计指针函数和函数指针
      • 7.3 多文件中的交互函数设计方法
      • 7.4 一个简单游戏设计实例
      • 第8章 C 程序结构化设计实例
      • 8.1 实用结构化程序设计基础
      • 8.2 程序设计实例
      • 8.2.1 功能设计要求
      • 8.2.2 总体设计
      • 8.2.3 函数设计
      • 8.3 参考程序
      • 8.4 运行示例
      • 第9章 库函数与算法基础
      • 9.1 算法基本概念
      • 9.2 算法典型实例
      • 9.3 基本库函数
      • 9.4 C语言预处理器
      • 9.5 高级库函数
      • 9.5.1 典型实用的高级库函数
      • 9.5.2 使用它们简化程序设计
      • 9.5.3 应用实例
      • 9.6 算法设计实例
      • 9.6.1 链表
      • 9.6.2 决策树
      • 9.6.3 状态机
      • 第10章设计游戏程序实例 365
      • 10.1剪刀、石头、布 365
      • 10.1.1设计思想 365
      • 10.1.2参考程序 367
      • 10.1.3运行示范 369
      • 10.2迷宫 370
      • 10.2.1设计思想 370
      • 10.2.2参考程序 371
      • 10.2.3运行示范 373
      • 10.3空战 375
      • 10.3.1设计思想 375
      • 10.3.2参考程序 376
      • 10.4贪吃蛇 381
      • 10.4.1供改造的源程序 381
      • 10.4.2运行示范 387
      • 10.5停车场 388
      • 10.5.1参考程序 388
      • 10.5.2运行示范 393
      • 10.6画矩形 393
      • 10.6.1用C语言编写Windows程序 394
      • 10.6.2Windows的程序结构 398
      • 10.6.3用C语言编写画矩形程序 400
      • 10.7俄罗斯方块 405
      • 10.7.1基本游戏规则 405
      • 10.7.2基本操作方法 406
      • 10.7.3编写游戏交互界面问题 406
      • 10.7.4用C语言编写控制台俄罗斯方块游戏 407
      • 10.7.5编写Windows俄罗斯方块游戏 419
      • 10.8用C语言编写Windows下的贪吃蛇游戏 430
      • 10.8.1程序清单 430
      • 10.8.2运行示范 442
      • 附录 7位ASCII码表 444
      • 参考文献 445

      以上就是本次介绍的C语言电子书的全部相关内容,希望我们整理的资源能够帮助到大家,感谢大家对码农之家的支持。

      上一篇:C#初学者指南

      下一篇:基于Bootstrap和Knockout.js的ASP.NET MVC开发实战

      展开 +

      收起 -

      下载地址:百度网盘下载
      C语言 相关电子书
      C语言入门教程:C语言小白变怪兽 PDF 超清版

      C语言小白变怪兽 是一套C语言学习入门教程,正式进入C 语言学习的一道「开胃小菜」,,目的是让读者对编程的基本知识有所了解,并且告诉读者如何少走弯路。既适合初学者入门(学习语法),也适合程序员进阶(学习底层),欢迎下载! 学习C语言,除了要学习语法,还要学习内存、字符编码、调试技巧以及编程思维,这些知识点本教程都做了详细讲解。 目录 1、编程基础 2、C语言初探 3、变量和数据类型 4、C语言输入输出 5、循环结构和选择结构

      立即下载
      C语言程序设计第2版课后习题答案 PDF 超清版 立即下载
      linux命令c语言实现方法 PDF 高质量版

      自己学习《APUE》时写的linux下一些命令(大概40个左右)实现,仅当学习使用,这些命令包括cat cp echo head ls paste rmdir tail umask who chattr cut expand join mkdir pwd sed tee uniq chgrp date find last mkfifo reboot sort wc chmod df ln mv rename split touch which chown du grep lsattr od rm tac

      立即下载
      STM8 C语言精品编程100例
      STM8 C语言精品编程100例 PDF 超清版

      《 STM8 C语言精品编程100例 》教程是关于100例关于STM8单片机的例程,从基础到各个模块的实践再到综合项目的实践,在于给您一个大体的程序编写思路,项目结构安排的大体构架等,可用于项目开发等,代码多且详细,需要的朋友可下载试试! 精准定位于初级学习目的,搭配丰富的代码注解,大幅提高开发技能,可以看得出作者真的很用心.这也让我们学习单片机基础更加的容易理解。 目录 实例1点亮三个发光二极管(LED) 实例2流水(LED)灯向左移动

      立即下载
      啊哈C语言!逻辑的挑战
      啊哈C语言!逻辑的挑战 PDF 完整修订版

      啊哈C语言!逻辑的挑战(修订版) 是一本非常有趣的编程启蒙书,《啊哈C语言!逻辑的挑战(修订版)》从中小学生的角度来讲述,没有生涩的内容,取而代之的是生动活泼的漫画和风趣幽

      立即下载
      读者心得
      31小时51分钟前回答

      学python要c语言基础么

      学python要c语言基础么?对于很多初学者来说,这可能都是一个很纠结的问题,或者自己找不到合适的方向。 到底是学习C语言,还是学习Python,其实是与你学习的目的相关。 分两个方向,如下 1、如果是走算法方向,也就是说学习一门语言是为了学习算法,边学算法边实现。那么建议从 C 语言或者 Java 语言开始学,因为 python 有太多的封装,实现了太多的细节,你只需要调用 python 的包就好,对提升算法效果稍小。 2.如果是入门者,并且没有学过编程的基础,那么建议将 python 作为入门语言,因为 python 对初学者友好且简单,通过简单几行的代码就可以实现很多的功能。能够增强你的信心。再有了一定的……

      129小时53分钟前回答

      python是c语言编的吗

      python是c语言编的吗? Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。 Python本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。 像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。 现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语……

      109小时39分钟前回答

      Java能写C语言编译器吗

      用java是可以写语言编译器的,用任何语言工具写都可以。各语言开发工具间只有开发效率的差异,没有可行不可行的区别。 编译器其实就是一个翻译工具,它可以把代码直接翻译成二进制文件交给CPU执行(二进制指令就是CPU的指令集,当然可以直接操作内存),当然,这个二进制文件需要符合操作系统的可执行文件的格式(PE格式或ELF格式)才能执行。 1、Java可以写C语言编译器,编译器就是一种把文本(源码)按语言语义的规则翻译成字节码的一套程序。 C通常不像Java跨平台,确定目标平台是什么,比如是x86、ARMS、MIPS、JVM,操作系统环境是什么,然后编写输出生成所在环境下能运行的字节码。 用任何……

      网友NO.33008
      网友NO.33008

      在写C语言程序的时候为了书写清晰、便于阅读、便于理解、便于维护,在编写程序时应遵循以下规则: 1、一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行; 2、函数体内的语句要有明显缩进,通常以按一下Tab键为一个缩进; 3、括号要成对写,如果需要删除的话也要成对删除; 4、当一句可执行语句结束的时候末尾需要有分号; 5、代码中所有符号均为英文半角符号。

      网友NO.47975
      网友NO.47975

      学习C语言的心得 首先我要告诉大家的是:第一,学习无捷径!对于学习编程而言,你现在的付出将来都是有回报的。但是,学习C语言也需要方法。 我遇到过很多学习C语言的人,包括我以前的同学,很多人都是学到一半就放弃了。那么为什么那么多人学习C语言都半途而废呢?原因就是他们找不到正确的学习方法!在学习的过程中四处碰壁,兴趣和自信心逐渐被消耗殆尽。对他们来说学习C语言是一件很痛苦的事! 事实上学习编程是一件很好玩、很有趣、很有意思也很有前途的事情!那么学习C语言有什么好的方法呢?根据我自己多年的总结,以及很多编程前辈的经验,主要有以下几个方面: 1) 分清主次 学习C语言最忌讳的就是不分主次,这是绝大多数学习C语言的同学都会犯的错误!我们刚开始学习的时候只需要将那些最重要的、最核心的学会就已经很好了!先将最精髓的东西提炼出来,再将整个C语言学一遍,从全局上把握C语言。对于那些次要的,有需要再学,没有需要也可以不学。 2) 一定要多上机,多“敲”代码 编程是一门实践性的学科,绝对不是理论。如果不动手“敲”代码的话,永远都学不会编程。很多问题只有在“敲代码”的时候才能发现,才会有更加深刻的体会、领悟和理解。而不是靠死记硬背书中的注意点,那样真的很痛苦。我在学习编程的时候从来都不会刻意记忆什么注意点,这些知识点都是在不停“敲代码”的过程中,自然而然地融入我的身体中的。 你们一定要记住一句话:“程序是写出来的,不是看书看出来的!” 3) 要“敲代码”,必学盲打 盲打是学习编程最基本的技能。就算你C语言学得很好,达到了“思想在键盘上飞舞”的境界,但是如果你不会盲打,那你想“飞”也“飞”不起来!所以,不会盲打会非常影响你的学习效率。 4) 要学会记笔记 编程需要不断地积累。我们一定要学会模仿别人优秀的代码、优秀的算法,然后将它记下来。一定要站在巨人的肩膀上学习。但是我们的记忆能力是有限的,时间长了难免会遗忘,所以一定要学会记笔记。一有心得、体会、感悟就写下来,这些都是很珍贵的。 我们在记笔记的时候,如果眼前没有计算机则可以先写在纸上,但事后一定要将它整理成电子版。整理成电子版看起来会很方便、舒适,还可以随意地增添和删改,保存时间也长。

      码农之家

      暨煜祺 提供上传

      资源
      33
      粉丝
      26
      喜欢
      280
      评论
      4

      Copyright 2018-2021 www.xz577.com 码农之家

      版权投诉 / 书籍推广 / 赞助:520161757@qq.com