A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陨石 高级黑马   /  2014-9-12 10:14  /  1804 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//导入输入输出库
#include<stdio.h>
//stdlib 头文件即standard library标准库头文件
//stdlib 头文件里包含了C、C++语言的最常用的系统函数
#include<stdlib.h>
//字符串处理函数标准库 为strcpy()和strcat函数提供原型
#include<stdbool.h>
//字符串处理函数标准库 为strcpy()和strcat函数提供原型
#include<string.h>
//一般要求逻辑运算符提供一种方法以判断字符是否不是空格、逗号,如此等等,但是罗列所有可能性太麻烦。
//ANSI C有一系列的标准的函数可以用来分析字符ctype.h头文字包含了这些函数的原型。这些函数接受一个字符作为参数,
//如果该字符属于某特定的种类则返回非零值(真), 否则返回零(假)。
#include<ctype.h>

/*
C语言的标准函数库中的头文件stdbool.h包含了四个用于布尔型的预定义宏。本头文件是在C99标准中引入的。

IEEE 1003.1-2001标准中的宏定义包括:

bool,会扩展为_Bool
true,会扩展为1
false,会扩展为0
__bool_true_false_are_defined,会扩展为1

*/
#include<stdbool.h>


/*
第十四章 结构和其他数据形式
关键字
struct,union,typedef

设计程序最重要的一个步骤就是选择一个表示数据的好方法。
C使用结构变量(structure variable)
有时候也把结构叫作模板,因为它勾勒出数据该如何存储。但它不是C++中的模板,只是一个词的不同用法
声明时,首先使用关键字struct,然后是一个可选标记 比如book ,它是用来引用该结构的快速标记
struct book library;
它把library声明一为一个使用book结构设计的结构变量
在结构声明中。接下来是用一对花括号括起来的结构成员列表。每个成员变量都用它自己的声明来描述,用一个分号来结束描述。
例如title是一个拥有MAXTITL个元素的char类型数组,每个成员可以是任何一种C的数据类型甚至可以是其它结构
结束花括号后的分号表示结构设计定义的结束。
这个声明放在所有函数的外面,如果是外部声明,可以被本文件中该声明之后的所有函数使用,
如果这个结构声明于一个函数的内部,它的标记只能在该函数内部使用。
词语结构(strcuture)有两个意思,一个意思是结构设计,一个是结构变量如下
struct book library 看到这条指令,编译器会创建一个变量library。编译器使用book模板为该变量分配空间
一个具有MAXTITL个元素的char数组,一个具有MAXAUTL个元素的char数组和一个float变量。这些存储空间是以一个名字为library的变量结合在一起.
优先级从上到下.
在结构变量的声明中,struct book所起的作用就像int或float在较简单的声明中的作用一样。
struct book doyle,panshin,* ptbook;
结构变量doyle,panshin均包含book结构中的title、author和value部分。
指针prbook可以指向doyle、panshin或任何其他book结构的变量。实际上book结构的声明创建了一个名为struct book的新类型
声明结构的过程和定义结构变量的过程可以被合并成一步。如下 只是省略了标记,当然如果多次使用就得带有标记
struct {
char title[MAXTITL];
char author[MAXAUTL];
float value;
}library;
初始化结构
struct book library={
        "the Pirate and the Devious Damsel",
        "Renee Vivotte",
        1.95
};
在结构中同样适用静态存储时期和动态存储时期,如果结构被声明为静态存储时期,初始化项目列表中的值必须是常量表式.
如何访问结构成员,用结构成员运算符号(.)就可以 比如library.value就是访问library的value部分
在本质上.title、.author在book结构中扮演了下标的角色
如何获取结构元素的地址例如 &library.value正好是这样的地址,其中点比&具有更高的优先级。因此这个表达式和&(library.value)相同
C99支持结构的指定初始化项目,语法与数组的指定初始化项目相似比如
struct book library = {.value = 10.99};
对特定成员的最后一次赋值是它实际获得的值比如
struct bok library = {
        .vlaue = 18.90,
        .author = "Philionna Pestle",
        0.25
};
最终value的值是0.25,因为它在结构声明中紧跟着author成员之后.新的0.25代替了18.90

声明结构数组
struct book library[MAXBKS]
这条语句声明library为一个具有MAXBKS个元素的数组,数组每个元素都是book元素
例如 library[0].value //第1个数组元素的value成员
         library[4].title //第5个数组元素的title成员
         数组下标紧跟着library而不是成员名后面
         所以 library.value[2];错误 library[2].value 正确

嵌套结构
从右到左解释 (fellow.handle).first
结构指针
声明 struct guy * him
初始化 him = &fellow[0];
在一些系统中结构的大小有可能在于它内部各成员在小之和,那是因为系统对数据的对齐存储需求会导致缝隙。
例如,系统有可能必须把每个偶数地址的成员放在是4的倍数的地址上,这样的结构就可能在其内部存在存储缝隙。
//->运算符类似点运算符但是不能用点运算符作用于指针,因为点运算符只能作用于结构
//->运算符只能作用于指针

枚举类型(enumerated type)
关键字enum声明代表整数常号的符号名称,可以创建一个新类型,并指定它可以具有的值(实际上,enum常量是int类型,使用int的地方都可以使用它)
它的语法和结构的语法相同,枚举类型的目的是提高程序的可读性
enum spectrum(red,orange,yellow,green,blue,violet);
enum spectrum color;
第一个声明设置spectrum为标记名,可以将enum spectrum作为一个类型名使用,第二个声明使用color成为一个变量.花括号枚举了变量可能有的值
例如: int c; color = blue; if(color == yellow) ...; for(color = red;color<=violet;color++)..;
枚举变量限定为任一种整数类型,只要该整型能保存这些枚举常量。比如spectrum枚举的常量在0-5之间,因此编译器使用unsigned char来表示变量color;
C的某些枚举属性不能延至C++.例如对枚举变量使用运算符++,而C++不允许
默认值
默认时,枚举列表中的常量被指定为整数值0,1,2 green的值为3
enum spectrum(red,orange,yellow,green,blue,violet);
指定值
enum spectrum(red=1,orange=99,yellow=44,green=77,blue=88,violet=10);
当只对一个常量赋值,其它没有赋值,那么会出现如下情况
enum spectrum(red,orange=99,yellow,green,blue,violet);
结果会显示red=0,orange=99,yellow=100,green=101依次类推
typedef工具是一种高级数据特性,它使某一类型创建自己的名字这一特性与#define相似但是有三个不同之处
typedef给出的符号名称仅限于对类型,而不是值
typedef的解由编译器,而不是预处理器执行
在受限的范围内比#define更灵活
声明 typedef unsigned char BYTE;
然后用BYTE定义变量
BYTE x,y[10],*z;
该定义的作用域取决于typedef 语句所在的位置。如果定义是在一个函数的内部,它的作用域就是局部的,如果在外部,就是全局的
通常这些符号名称是大写的,以提醒这个类型名称是一个符号缩写,但是也可以是小写的
typedef unsigned char byte;
管理变量名的同样规则也用来管理typedef使用的名字
是否可以用#define代替typedef
typedef unsigned char BYTE
#define unsigned char BYTE
这是一样的,但是下面是#define实现不了的
typedef char * STRING;
如果没有关键字typedef该例将STRING识别为一个char指针.有了这个关键字,使STRING成为char 指针的标识符
STRING name,sign; 意思是char * name, * sign;
如果是#define STRING char * 那么STRING name,sign;就成了 char * name,sign;
也可以对结构使用typedef;
typedef struct complex{
        float real;
        float imag;
}COMPLEX;
这样就可以使用COMPLEX 代替结构
使用typedef来命名一个结构类型时,可以省去结构的标记
typedef struct {double x;double y;}rect;
使用 rect r1 = {3.0,6.0}; rect r2;r2=r1;
如果两个结构声明都不使用标记,但是使用同样的成员(成员名和类型都匹配),那么C认为这两个结构具有同样的类型。
使用typedef另一个原因是typedef的名称经常被用于复杂的类型
typedef char(* FRPTC())[5];
//这是一个二维多变的字符数组 FRPTC()函数可以返回一个指向含有5个元素的char数组的指针
转换后是 char *[函数返回值][5] 第一维指针,第二维含有5个元素的数组,指针指向数组
当使用typedef时,它并不创建新的类型,只是创建了便于使用的标签,结构,联合,typedef都是c处理数据的工具。

一些复杂的声明
声明时可以使用的修饰符
修饰符                含义
*                        表示一个指针
()                        表示一个函数
[]                        表示一个数组
C允许同时使用多于1个的修饰符,这就使得可以创建如下各种各样的类型
int board[8][8];                        //int数组的数组
int ** ptr;                                        //指向int的指针的指针
int  * risks[10];                        //具有10个元素的数组,每个元素是一个指向int的指针
int (* rusks)[10];                        //一个指针,指向具有10个元素的int数组
int  * oof[3][4];                        //一个3*4的数组,每个元素是一个指向int的指针
int (* uuf)[3][4];                        //一个指针,指向3*4的int数组
int (* uof[3])[4];                        //一个有个3个元素的数组,每个元素是一个指向具有4个元素的int数组的指针

6 个回复

倒序浏览
表示一下,c语言我已经忘光了。
回复 使用道具 举报
不错。。。
回复 使用道具 举报
太多了代码乱,没多少人会认真看的
回复 使用道具 举报
LZ 学IOS是不是要很强的C???
回复 使用道具 举报
猛@!!!!!!!!!!!!!!!!
回复 使用道具 举报
陨石 高级黑马 2014-9-17 13:34:24
7#
是。。。。排版太差了。。。有待提高。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马