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

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

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

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

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

      内容介绍

      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

      学习笔记

      Python调用C语言的方法【基于ctypes模块】

      本文实例讲述了Python调用C语言的方法。分享给大家供大家参考,具体如下: Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add 2 numbers - int and floats#include stdio.hint add_int(int, int);float add_float(float, float);int add_int(int num1, int num2){ return num1 + num2;}float add_float(float num1, float num2){ return num1 + num2;} 接下来将C文件编译为.so文件(windows下为DLL)。下面操作会生成adder.so文件 #For Linux$ gcc -shared -Wl,-soname,adder -o ad……

      python 调用c语言函数的方法

      虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调用c的代码了 具体流程: c编写相关函数 ,编译成库 然后在python中加载这些库,指定调用函数。 这些函数可以char ,int, float, 还能返回指针。 以下示例: 通过python调用c函数,返回"hello,world 字符串" 新建c语言文件 hello.c touch hello.c #include stdio.hchar *get_str(){ return "hello,world"} 编译成库 gcc -o hello.so --share -fPIC hello.c 新建python脚本 touch test.py from ctypes import *dll = CDLL("./hello.so")dll.get_str.restype = c_char_pstr = dll.get_str()print(string_at(str, 11)) 执行python脚本 [feng@arch python_c]$ python test.py hello,world 以上就是本文的全部内容,希望对大家的……

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

      上一篇:C#初学者指南

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

      展开 +

      收起 -

      下载地址:百度网盘下载
      C语言相关电子书
      C语言实用之道
      C语言实用之道 原书扫描版

      这是一本C语言实用详解,用大量工业级例子来展示C语言编程中的基础概念和典型使用场景,可以学习实用的C技术,包括在可复用的函数中经常用到的算法等

      立即下载
      数据结构与算法分析:C语言描述
      数据结构与算法分析:C语言描述 含答案高清版

      书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能、效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构

      立即下载
      C语言点滴
      C语言点滴 高清版

      C语言兼具高级语言和汇编语言的特点,学习起来难度较大,令不少初学者望而生畏。同时,C语言又是一门应用非常广泛的编程语言,在实际应用中如何根据不同的应用场景高效地使用C语言,

      立即下载
      C语言编程魔法书:基于C11标准
      C语言编程魔法书:基于C11标准 高清版

      C语言编程魔法书:基于C11标准 主要讲解C11标准的语法内容,并且从整个编译、连接到加载过程都会涉及。同时在后会分别介绍GCC编译器与Clang编译器的C语言语法扩展。通过阅读本书,读者能够

      立即下载
      自制编程语言:基于C语言
      自制编程语言:基于C语言 全书影印版

      前百度网高级技术工程师、专业书《电脑操作系统实情复原》的创作者的另一大作业内权威专家联名鞋强烈推荐滴滴打车系统部技术性高级主管于晓声阿里巴巴网蚂蚁金服技术性权威专家肖金

      立即下载
      零基础学C语言
      零基础学C语言 超清版 立即下载
      读者留言
      网友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) 要学会记笔记 编程需要不断地积累。我们一定要学会模仿别人优秀的代码、优秀的算法,然后将它记下来。一定要站在巨人的肩膀上学习。但是我们的记忆能力是有限的,时间长了难免会遗忘,所以一定要学会记笔记。一有心得、体会、感悟就写下来,这些都是很珍贵的。 我们在记笔记的时候,如果眼前没有计算机则可以先写在纸上,但事后一定要将它整理成电子版。整理成电子版看起来会很方便、舒适,还可以随意地增添和删改,保存时间也长。

      weixin_3866

      weixin_3866 提供上传

      资源
      32
      粉丝
      44
      喜欢
      280
      评论
      4

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

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