C语言程序设计Tarena High-End IT Training 达内科技公司培训资料_第1页
C语言程序设计Tarena High-End IT Training 达内科技公司培训资料_第2页
C语言程序设计Tarena High-End IT Training 达内科技公司培训资料_第3页
C语言程序设计Tarena High-End IT Training 达内科技公司培训资料_第4页
C语言程序设计Tarena High-End IT Training 达内科技公司培训资料_第5页
已阅读5页,还剩138页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言 C语言概述 C语言及标准化 最早由DennisRitchie于1973年为Unix设计并实现 从贝尔实验室到世界各地 标准化C89ANSI 美国国家标准委员会 于89年12月正式通过 1990年被ISO批准为国际标准C991999年ISO通过了新版的C标准 包含了一些重要的改变基于C的语言C JavaC Perl C语言的特点 C语言是一种底层语言C语言是一种小型语言有限的语言特性依赖标准函数库C语言是一种包容性语言更广阔的自由度不强制进行详细的错误检查C语言不是一个强类型的语言 但类型检查机制已经得到了加强 C语言的优点 高效可移植功能强大灵活从嵌入式到商业数据处理限制少标准库与Unix系统集成 C语言的缺点 更容易隐藏错误有时会难以理解有时会难以修改 C语言基本概念 编写一个简单的C程序 一个简单的C程序 includeintmain printf HelloWorld return0 保存为xxx c 编译和连接 预处理预处理器执行 开头的命令 通常称为指令 编译编译器会将程序翻译成机器指令 目标代码 连接连接器把目标代码和所需的其他附加代码整合在一起 产生可执行的程序 GCC GNUCCompiler的简称 现指GNUCompilerCollection新版本gcc可以编译ada C C fortran java和Objective CGNU为自由软件基金会的一个项目GCC可以免费获取 还可以在多个操作系统中运行GCC是许多基于Unix系统 Linux BSD MacOSX 的主要编译器 并广泛应用于商业软件开发 GCC使用 选项 c编译 o自定义目标名 std c89或 std c99 pedantic根据C标准产生警告消息 Wall编译器检测到可能的错误时生成警告消息 O0不优化 O1缺省优化 O3最高优化 E仅预处理 S产生汇编 HelloWorld中的语言特性 指令 include函数自定义函数库函数main函数语句显示字符串printf 注释 注释 注释的习惯使用方式盒型注释简化盒型翼型注释注释的嵌套是不合法的忘记终止注释可能导致严重问题C99提供的新注释形式 变量和赋值 变量类型intfloat声明intx floaty z 必须把声明放在语句之前C99中 声明可以不在语句之前赋值给float变量的赋值需要在数值后加f混合赋值是可以的 但不一定安全 变量的初始化 用printf显示变量的值printf d x printf f y printf d 2f x y 变量初始化变量未初始化时访问初始化 标识符和关键字 标识符 变量 函数 宏 其他实体的名称以字母 下划线开头可以包含字母 下划线 数字大小写敏感不能和关键字冲突标识符长度有限制吗 C89声称可以任意长 但编译器只记住前31个C99中是63个关键字有特殊含义的一串字符全部小写标准库中的函数名全部小写 C语言书写规范 语句可以分开放在任意多行内空格使我们更容易区分缩进有助于轻松识别程序嵌套空行可以把程序划分成逻辑单元驼峰命名方式和下划线区分方式 基本类型 整数类型 C中 基本类型只有char int float double四种有符号和无符号Singed 默认 UnsingedShort和long16位机和32位机上的整数类型的表示范围表示范围并非C标准定义 根据编译器的不同而不同C99中增加的整数类型LonglongintUnsigedlonglongint有些编译器支持非标准的128位整数 字面值和常量 整数常量 字面值 3被认为是int3 5被认为是double3 5f被认为是float3 5L被认为是longdouble35L被认为是longint35LL被认为是longlong35u被认为是unsignedint35UL是unsignedlong八进制和十六进制03770 x12ab 浮点类型 C提供三种浮点类型Float 单精度Double 双精度Longdouble 扩展双精度C标准没有说明精度的范围有多少IEEE提供了精度 Float1 17548 10 38 3 40282 10 38 Double2 22507 10 308 1 79769 10 308 浮点常量以下浮点常量有效57 057 57 0e057E05 7e15 7e 1 57e2570e 1 字符类型 char各ASCII A 65 a 97 0 48字符操作Charc a C 65 C c 1 C 有符号和无符号charC标准没有说明普通char是有符号还是无符号C语言对字符类型视为整数类型 转义序列 响铃 a退格 b换行 n回车 r水平制表 t垂直制表 v特殊字符 使用printf 输出各种类型的变量值 printf 格式字符串 i dint f lffloat double hd ldshortint longint uunsignedint cchar sstring paddress o八进制 x X十六进制 gfloat double去尾零 e E科学计数法 Scanf 从键盘输入 scanf 格式串 地址表 格式串后的每个参数都必需是一个地址 指针 函数返回实际被转换并赋值的输入项的数目格式符d十进制整数型i整数型 可以是八进制 十进制 十六进制o八进制整数u无符号十进制整数x十六进制整数c字符s非空白符组成的字符串efg浮点数p地址 Sizeof sizeof 类型 sizeof 变量名 sizeof 表达式 sizeof只关心类型 只会分析括号中的类型 不会对括号中的内容进行运算 如 inti 5 sizeof i 10 计算的结果 i是多少 运算符和表达式 运算符 type sizeof从右向左 从右向左 算术运算符 运算符 可能产生意外的结果运算符 要求操作数是整数把0做为 或 的右操作数会出现未定义的行为当运算符 和 用于操作负数 其结果未定义C89中 操作数的其中之一是负数 结果可以向上取整 也可以向下取整 如 9 7的结果可以是 1 也可以是 2 如果i和j其中一个是负数 i j的结果依赖具体实现C99中 除法的结果总是向零截取 因此 9 7的结果是 1 i j的结果符号与i相同 练习 将一个二位数逆序打印如29 92提示 n 10获得个位数 n 10获取十位数试想如果是三位数呢 练习 EAN13通用商品条形码一般由前缀部分 制造厂商代码 商品代码和校验码组成 条形码的前几位数 00 09代表美国 加拿大 45 49代表日本 690 693代表中国大陆 471代表我国台湾地区 489代表香港特区 校验码就是条形码中最后一位 具体计算规则如下 比如说某个商品的条形码是 69230762131951 把奇数位的数字加起来 除了最后一位校验码 这里是6 2 0 6 1 1 16这个 A2 把偶数位的数字加起来 这里是9 3 7 2 3 9 33这个 B3 A 3 B 1 114 对10取余 44 9 4 5这就是最后一位那个校验码5的来历 赋值运算 一般的运算符不会改变操作数的值但赋值会改变操作数的值赋值的右结合性i j k 0 是合法的k 1 j i 是合法的左值左值表示存储在计算机内存中的对象 而不是常量或计算结果赋值运算要求左操作数必须是一个左值10 I 错i j 0 错 i j 错复合赋值 自增和自减 前 和后 前 和 同一表达式多次出现 和 运算 结果往往很难理解i 1 j 2 K I j I 1 J 2 K i j 逻辑表达式 关系运算符 判等 逻辑运算符 和 的短路特征逻辑运算的结果 真或假 0或1 位运算 按位与经常用来屏蔽某些二进制位 置0 也可以知道一个数的某一位是1还是0 按位或经常用来将某些二进制位置1 也可以知道某个二进制位是1还是0 按位异或可以用来将指定的位反转 按位取反 右移左移右边空位补零 右移左边空们补符号位 无符号数补零移位运算经常用来拆字节和凑字节 地址运算符 取地址 根据地址取变量printf中的 p用来输出地址 取地址取得的是一个变量的开始地址 地址是按字节编号的 表达式计算时的类型转换 if 任何一个数为longdouble 将另一个数转成longdouble elseif 任何一个数为double 将另一个数转成double elseif 任何一个数为float float elseif 任何一个数是unsignedlongint unsignedlongint 表达式计算时的类型转换 elseif 一个是longint而另一个是unsignedint if longint可以表示所有的unsignedint的值 将unsignedint转成longint else 将两个数都转成unsignedlongint elseif 一个是longint 另一个转成longint elseif 一个是unsignedint 另一个转成unsignedint else 两个数都转成int类型 流程控制语句 If语句 if 表达式 语句if 0 n 复合语句 多条语句 else子句级联式if语句悬空elseif y 0 if x 0 r x y elseprintf Error yisequalto0 n 条件表达式 表达式1 表达式2 表达式3 Switch语句 switch 控制表达式 case常量表达式 语句 default 语句 控制表达式被当做整数处理 可以是字符 但不能是浮点数事项字符串常量表达式必须是常量 如3 A 2 5语句可以是零到多条不允许重复分支 default不一定在最后break 循环 while 表达式 语句无限循环while 1 练习显示平方表14916 数列求和输入一些数据 输出这些数之和 do语句 do语句while 表达式 练习计算整数的位数 for语句 for 表达式1 表达式2 表达式3 语句 for的惯用法for i 0 i0 i 在for循环中省略表达式C99中的for语句for inti 0 i n i 逗号运算符 空语句 经常用来编写空循环体的循环C程序员习惯性地把空语句单独放置在一行不小心在if while for中的圆括号后放置分号会创建空语句if d 0 fhile i 0 for 退出循环 breakcontinuegoto 练习 账簿结算开发一个程序用来维护账簿的余额 程序将为用户提供选择菜单清空账户余额存钱取钱显示当前余额 数组 数组 含有多个数据值的数据结构每个数据值具有相同的数据类型 这些数据称为元素数组下标从0开始C语言不检查下标的范围 当越界访问时 结果不可预知对于某些编译器 以下代码会产生莫明其妙的结果inta 10 i for i 0 i 10 i 下标越界 可能段错误 可能破坏数据 a i 0 练习 用户输入一串数放入数组中 然后反向输出出来 数组初始化 数组初始化用大括号括起来的常量表达式列表初始化数组很常见如果初始化数组短 那么剩余元素赋值为0利用以上特性 很容易把数组初始化为全0 inta 10 0 如果给定了初始化式 可以省略掉数组长度C99中的指定初始化式inta 15 2 10 5 20 14 40 inta 15 5 20 2 10 14 40 inta 5 20 2 10 14 40 练习 检查数中重复出现的数字用户输入一个数字 程序显示是否有重复数字试着使用头文件中的bool true false 对数组使用sizeof 运算符 sizeof 数组名 可以确定数组的大小以下表达式可以确定数组的长度sizeof 数组名 sizeof 数组名 0 这种用法比较灵活 但麻烦 可以使用宏来简化 练习 计算利息在几年内100元投资在不同利率下的价值 由用户输入最低利率和投资年数Years6 7 8 9 10 1106 00107 00108 00109 00110 002112 36114 49116 64118 81121 003119 10122 50125 97129 50133 104126 25131 08136 05141 16146 415133 82140 26146 93153 86161 05 多维数组 数组可以有任意维数C语言是按照行主序存储数组的 多维数组一样如此多维数组的初始化初始化式没有足够的数填满数组 则补0甚至可以省掉内层花括号 练习 发牌程序负责发一副标准纸牌 每张标准纸牌都在一个花色 梅花 方块 红桃或黑桃 和一个等级 2 3 4 5 6 7 8 9 10 J Q K A 程序需要用户输入手里应该握有几张牌 C99中的变长数组 intn scanf d n inta n c99only 二维数组允许用一维数组赋初值 如 a 2 3 1 2 3 4 5 二维数组允许初始化的个数少于数组的个数 默认为0 函数 函数 函数是一连串语句 这些语句组合起来 并被指定了一个名字函数返回值 形式参数 函数体和实际参数不带返回值的函数函数的定义函数不能返回数组 除此之外没有其他限制指定返回类型是void代表函数没有返回值如果省略返回类型 C89会假定返回int C99中不合法函数体中可以出现变量声明和语句 但在C89中 声明必须的语句之前 C99中没有此限制 练习判定素数 函数声明 隐式声明函数声明和函数原型声明没有函数体声明可以不写参数名C99规则 在调用一个函数之前 必须先对其进行声明或定义 形式参数和实际参数 形式参数和实际参数的区别void形参和空形参函数调用中的值传递实际参数的转换编译器在调用前遇到原型编译器在调用前没有遇到原型float doublechar short int数组型参数形式参数可以不用说明数组的长度函数中无法确定数组长度 只能用第二个参数传入形参是多维数组 可以不指定数组的长度 但一定要指定数组的列数 return return表达式 如果表达式类型与函数返回类型不匹配 会隐式转换如果没有给出表达式 return可以出现在void函数中在void函数中的最后一句加return没有意义 因为函数即使没有return也会返回在非void函数中如果到达函数体的末尾也未遇到return 如果程序试图返回一个值 其行为未定义 程序终止 main函数中的return将导致程序终止C99中省略函数的返回类型是不合法的Main函数中终止程序中的另一个方法是调用exit函数exit 0 exit EXIT SUCCESS exit EXIT FAILURE 需要 include头文件Main中的return和exit没有差异Exit可以在任何地方终止程序 递归 recursive 一个函数调用本身 叫做递归调用递归函数的特征 一定有退出条件每次递归调用 会让解决的问题向已知条件靠近练习 求阶乘汉诺塔 变量和作用域 局部变量和全局变量 局部变量自动存储期限auto块作用域C99中的作用域可能更小静态局部变量静态局部变量具体有静态存储期限静态局部变量依然是块作用域形式参数形式参数和局部变量唯一的不同是 形式参数在每次函数调用时会被自动初始化 全局变量 外部变量 静态存储期限文件作用域 练习 用全局变量实现栈 全局变量的的利弊 少数几个函数共享大量时 外部变量很有用但一般我们尽量避免使用维护代码时 改变全局变量需要检阅所有使用过该变量的函数外部变量值赋值错误时 很验证确定是哪个函数出错使用了外部变量的函数很难复用 作用域 规则 当程序块内的声明命名一个标识符 如果此标识符已经是可见的 新的声明会临时 隐藏 旧的声明 标识符获得了新的含义 示例 指针 指针变量 内存被分为字节 每人字节有唯一的地址指针就是地址指针变量可以存储指针指针变量的声明int p int q int k inti j a 10 p q 每个指针变量只能指向一种特定类型的对象 取地址和间接寻址 指针的基本应用 指针赋值指针作为参数练习 写一个函数 找出一个数组中的最大值和最小值指针做为返回值函数可以返回一个指针永远不要返回指向自动变量的指针 指针和数组 指针的算术运算加上整数减去整数两个指针相减指针比较用指针处理数组 p 或 p p p或 p p或 p 用指针名作为数组指针和多维数组 字符串 字符串字面量 双引号延续字符串字面量 Iamstring andgoon astring anotherstring 存储字符串字面量字符串以 空字符 结束 0 编译器会把字面量看做是char 类型的指针根据指针和数组的关系 对字符串可以取下标charc abc 1 字符串字面量和字符常量 字符串变量 C中 字符串由一维数组存储 但必需在结尾加 0初始化字符串变量chardate 8 July10 chardate July10 字符数组和字符指针char date July10 chardate July10 字符串的输入输出 输出printf s n str printf 6s n str printf 10 5s n str puts str 输入scanf s str 注意不需要加 scanf永远不会读入空白符 而会跳过 换行 空格 制表等空白符会使scanf结束gets 可以读取一行 而且不会在开始读字符之前跳过空白gets 会持续读入直到换行符停止gets 会忽略掉换行符 读取字符注意事项 scanf和puts读入字符串时无法判断数组是否已经填满可以用 ns代替 s使用scnaf更安全自定义函数逐个字符读字符串intreadLine charstr intn 使用getchar const和字符串 使用C语言的字符串库 直接复制或比较字符串字符会失败charstr1 10 str2 10 str1 abc Errorstr2 str1 Errorcharstr3 10 abc Ok includestrcpy超出数组长度后的结果无法预料strncpystrlenstrcatstrcmp 练习 显示一个月的提醒列表用户输入一系列提醒 每条提醒都要有一个前缀来说明是一个月中的哪一天 当用户输入0时 程序显示出录入的全部提醒列表 并按日期排序 程序运行如下 输入一个提醒 24莎莎的生日输入一个提醒 58 00和丽丽约好去晨练输入一个提醒 26和莎莎看电影 盗梦空间 输入一个提醒 5晚上上英语课 剑桥国际英语2 输入一个提醒 0程序输出 日期提醒8 00和丽丽约好去晨练晚上上英语课 剑桥国际英语2 charreminders MAX REMIND MSG LEN 3 charday str 3 msg str MSG LEN 1 intday i j num remind 0 for if num remind MAX REMIND printf Nospaceleft n break printf Enterdayandreminder scanf 2d if day 0 break sprintf day str 2d day read line msg str MSG LEN for i 0 ii j strcpy reminders j reminders j 1 strcpy reminders i day str strcat reminders i msg str num remind 字符串惯用法 搜索字符串尾strlen的实现while s s while s 复制字符串strcat的实现while p s 字符串数组和命令行参数 charstrs 8 char strs 命令行参数intmain intargc char argv 练习 从命令输入人名 判断是否是会员 预处理器 预处理指令 宏定义 define文件包含 include条件编译 if ifdef ifndef elif else endif undef 预处理指令使用规则 指令都以 开始 不要求必须是行首 只要前面有空白符就行指令的符号之间可以插入任意数量的空格或制表符指令总是在第一个换行符处结束 除非明确地指出要延续 defineTESTaaa bbb指令可以出现在程序中的任何地方注释可以与指令放在同一行 宏定义 简单的宏 对象式宏 define标准符替换列表简单宏定义主要用来定义那些 明示常量 defineSTE LEN80 defineTRUE1 defineFALSE0 definePI3 1415926 defineCR r defineEOS 0 常见的错误定义 defineN 10 defineN100 宏定义带来的好处 程序会更易读程序会更易于修改可以避免前后不至或键盘输入错误可以对C语法做小的修改 defineBEGIN defingEND defineLOOPfor 对类型重命名 defineBOOLint控制条件编译不要滥用宏 千奇百怪的helloworld 带参数的宏 宏函数 带参数的宏 函数式宏 define标识符 x1 x2 替换列表特别注意 标识符和 之间不能有空格宏函数的替换 defineMAX x y x y x y defineIS EVEN n n 2 0 defineTOUPPER c a c y t definegetchar getc stdin 圆括号是必须的吗 是的 练习 写一个宏函数 用它来验证一个日期是否合法 defineISLEAP y y 4 0 y 100 0 y 400 0 defineISSMALL m m 4 m 6 m 9 m 11 defineNORMAL m ISSMALL m 30 31 defineDAYS y m m 2 28 ISLEAP y NORMAL m defineIN x from to x from x 1600 IN m 1 12 IN d 1 DAYS y m 宏函数的优缺点 优点程序可能会稍微快一点宏更 通用 宏函数中的参数不检查类型缺点编译后的代码通常会变大宏参数没有类型检查无法用一个指针指向宏宏可能会不止一次地计算它的参数n MAX i j 和 运算符 运算符只能出现在宏函数中 其作用是将参数字符串化 definePTINT INT n printf n d n n 运算符将两个记号 粘合 在一起 成为一个记号 其中一个记号一般为宏参数 defineID n i nintID 1 ID 2 ID 3 DefineGEN MAC type typetype max typex typey returnx y x y 预定义宏 LINE 被编译文件行号 FILE 被编译文件名 DATE 编译的日期 TIME 编译的时间 STDC 如果编译器是标准的 那么值为1 条件编译 if和 endif defineDEBUG ifDEBUGprintf Valueofi d n i printf Valueofj d n j endif if常量表达式常量表达式为0时 预处理器删除 if和 endif中间的代码 if会把没定义过的标准符视做为0 如果没有定义DEBUG 测试 ifDEBUG会失败 但 if DEBUG会成功 ifdef ifndef elif else endif 编写大型程序 多个源文件和头文件 include在系统位置找头文件 include 文件名 从当前目录找 找不到再到系统位置找可以用宏来定义文件名 ifdefined IA32 defineCPU FILE ia32 h elifdefined IA64 defineCPU FILE ia64 h elifdefined ADM64 defineCPU FILE amd64 h endif includeCPU FILE 使用头文件 共享宏定义 include共享函数原型共享变量声明Extern保护头文件防止多次包含头文件 ifndefBOOLEAN H defineBOOLEAN H endif 练习 构建自己的工具库 构建多文件程序 编译和链接Makefile 结构 联合和枚举 结构 结构变量struct intnumber charname 10 intonHand part1 part2 初始化 112 Disk 10 C99中的指定初始化 number 112 name Disk onHand 10 操作结构part1 number 113 strcpy part1 name Disk2 part2 part1 结构类型 结构标记声明structpart intnumber charname 10 intonHand 用标记声明变量structpartpart1 part2 使用typedef简化声明 练习 定义结构点 再定义结构rect 矩形 由两个点组成 计算每个点离 0 0 的距离 再计算矩形的面积定义一个包含一年中各个月份的名字和每个月天数的表格 输出这个表格 用一个结构的数组保存结构 在每个结构中保存一个月的名字和天数 JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberDecember 结构作为参数和返回值 结构作为参数结构变量的值传递结构指针结构作为返回值练习 结构的对齐与补齐 由于内存分配会将结构中的变量分配到内存的边界上 以方便访问 所以每个成员放的位置是从本身长度的倍数位开始放 但本身长度超过4时 以4计 此称为对齐 char1倍short2倍int4倍double4倍整个结构变量的长度要保持内部最长成员 超过4以4计 的倍数 如果不够 则补齐 位段 位域 用整个一个字节 char 去表示一个二进制变量 如一个on off开关 看起来有点铺张浪费 而char已经是c中的可以独立分配与寻址的最小单位了 此时可使用域MS DOS操作系统中存储日期的方式structfile date unsignedintday 5 unsignedintmonth 4 unsignedintyear 7 位域类型必须是int unsignedint或signedint int有些编译器上会有二义性 不能取得域的地址 除此之外 域完全可以像其他变量一样使用 联合 联合的操作几乎和结构相同union inti doubled u 用联合提供数据的不同视角 枚举 枚举是一个常量整形值的列表 其中的值都是枚举常量 默认从零开始 可以定义时指定值 也可以多个枚举名表示同一个值 枚举常量可看成字面量 enumescapes BELL a BACKSPACE b TAB t NEWLINE n VTAB v RETURN r enummonths JAN 1 FEB MAR APR MAY JUN JUL AUG OCT NOV DEC enumsuit CLUBS DIAMONDS HEARTS SPADES 高级指针应用 关于指针 指针变量 指针是一个变量野指针防止野指针 空指针 初始化为0 或NULL打印时输出nil没有办法检查一个指针是否是野指针 但可以检测出空指针宁可用空指针 不用野指针指针的加法 加一个整数指针的减法 减去一个整数 或减去一个指针悬空指针 不要在函数中返回普通局部变量的地址 返回一个字符串字面量是安全的 因为字符串字面量是静态分配的 int p q是定义了一个指针 一个int型的变量 关于指针 我们总是通过操作指针来操作目标 比如swap函数值传递和地址传递 本质上是值传递数组做为参数传递时传的是指针常量指针constchar p NULL 指向的对象是常量charconst p NULL 指针自己是常量constchar constp NULL 到const的const指针常量指针指不会通过指针修改目标数据 但并不代表这个指针中的值不可改变 当然 也没有办法阻止别人修改目标数据 在函数的参数中使用常量指针特别有用inta 1 constintc 2 constint p1 试图修改c的值 双指针 指向指针的指针地址指针 指针的指针 二级指针想间接地修改指针的指向时 可以用二级指针示例intstr2int constchar str constchar q intr 0 while isdigit str r r 10 str 0 str q str returnr void指针 代表任何类型的指针 对此不能用 取变量 可以用类型转换还原类型 函数指针 指向函数的指针利用函数指针将函数做为参数传递示例一 对一组数据做不同的处理示例二 利用不同的排序规则排序 动态存储分配 在程序执行期间进行内存分配动态内存分配适用于所有类型 但多数情况下是对字符串 数组 结构的分配内存分配函数malloc分配但不对内存进行初始化calloc分配且对内存进行清零realloc调整先前分配的内存大小以上内存分配函数声明在头文件中函数无法知道计划存储在内存块中的数据是什么类型 所以内存分配函数都返回void 类型当内存分配失败时 函数返回空指针if p NULL 动态分配字符串 分配空间char p char malloc n 1 赋值strcpy p abc 在函数中的动态分配char concat char s1 char s2 char r malloc strlen s1 strlen s2 1 strcpy r s1 strcat r s2 returnr 动态分配数组 使用malloc分配int a malloc n sizeof int 使用calloc分配int a calloc n sizeof int structpoint intx inty p p calloc 1 sizeof structpoint realloc函数调整分配后的大小当扩展内存时 不会对增加的内存初始化失败时返回空指针 原内存中的数据不会改变第一个参数是空指针时 如同调用malloc如果以0作为第二个参数 会释放原内存块小心 realloc可能会将内存块移到别的地方去 释放存储空间 动态分配的空间都来自于称为 堆 的内存池中 不可再访问而又没释放的内存称为 垃圾 存在垃圾的程序存在 内存泄漏 现象free函数每个c程序员都需要自己收回各自的不用内存 参数为空指针不起作用 如非分配函数返回的地址结果未定义可能会造成悬空指针问题试图访问或修改释放过的内存结果未定义 输入输出 格式化输入 printf fprintffprintf stderr Error datafilecan tbeopened n printf转换说明 标志最小字段宽度精度长度修饰转换说明符标志 左对齐 默认右对齐 有符号数总是以 号开始 以0开头的八进制 以0 x开头的十六进制0用前导零填充转换说明中的宽度和精度可以用 号表示 这时 宽度和精度的值通过转换下一个参数来计算 该参数必须为int 如 printf s max s printf示例 c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论