C Primer Plus--结构和其他数据类型(2)
C Primer Plus--结构和其他数据类型(2)
枚举类型 enumerated type
枚举是用来代表整数常量的符号,枚举类型的声明与struct声明类似。枚举常量都是int型的。枚举声明的花括号内枚举了该类型变量可能有的值。枚举是为了增强程序的可读性。
enum vehicle {bicycle,car,plane,train,ship};
上面说了枚举类型就是int类型的常量,那么凡是可以使用int的地方都可以使用枚举常量。
枚举默认值
枚举列表中的默认值被指定为整数值0、1、2等等。如上面枚举声明中:
bicycle、car、plane、train、ship的值依次为0 1 2 3 4。
为枚举指定值
enum levels {low = 20, medium = 50, high = 80, perfect = 100};
enum phones {ios, windowsPhone = 60, blackberry = 80, android};
//ios = 0; android = 81
在C中,允许对枚举类型的变量使用自增(++)或自减(--)符号,但是在C++中不允许,为了使得程序兼容,应该一开就将变量声明为int型。
enum vehicle {bicycle,car,plane,train,ship};
enum vehicle trans;
//在C++中要声明为
//int trans;
//trans此时的值不确定,需要赋值
for (trans = bicycle; trans <= ship ; trans++) {
printf("%d\n",trans);
}
命名空间 namespace
在C中,变量名和标记名(结构标记、联合标记、枚举标记)不在同一个命名空间中,因此二者可以同名,但在C++中不可以。
struct car {
char brand[30];
int litre;
};
int car = 0;
//C中不冲突
typedef关键字
typedef工具是一种高级数据特性,他使您能够为某一类型创建您自己的名字。在这个方面,它和#define相似,但是它们具有三个不同之处:
- 与
#define不同,typedef给出的符号名称仅限于对类型,而不是对值 typedef的解释由编译器而不是预处理器执行- 虽然它的的范围有限,但在其受限范围内,
typedef比#define更灵活
这里就告诉我们typedef并不创建新的数据类型,只是创建了易于使用的标签别名。
例:顶一个一个数据类型别名BYTE,它只占一个字节,可以先定义一个char变量BYTE,然后在前面加上typedef即可。
typedef unsigned cahr BYTE;
BYTE x;//定义一个x
BYTE Y[10];//定义一个数组容纳十个BYTE
BYTE * z;//定义一个指向BYTE的指针
总之,#define只是由预处理器对文件里的字符进行替换,而typedef则新建了一种数据类型的代替。
typedef char * STRING;//STRING成了char指针的别名
STRING a,b;//声明两个char指针a,b
//若是用define来试一试
#define STRING char *;
STRING a , b;//这里被预处理器替换,成了char * a , b;两个就不都是指针了,只有a是,b成了字符。
typedef struct {
float real;
float imag;
} COMPLEX; //将这个struct起个别名COMPLEX
COMPLEX foo = { 1.0 ,1};//一个复数
复杂的typedef:
typedef char (* FRPTC())[5];
这里FPRTC返回的是一个指向含有5个元素的char数组的指针。
* () []修饰符
这三者优先级有低到高:* < () = [],而且他们与变量名的结合是从左到右的。
int foo[12][24];//一个12x24的int二维数组
int * p;//一个指向int的指针
int ** ptr;//一个指向int的指针的指针
char * strings[5];//一个数组,共5个元素,每个元素是一个指向char的指针
int (* pointer) [5];//一个指向int[5]数组的指针
int * bar[12][24];//一个12x24的二维数组,每个元素是一个指向int的指针
int (* pp) [12][24];//一个指向12x24二维数组的指针
int (* ppp[3]) [4];//一个数组,共三个元素,每个元素是一个指向int[4]数组的指针
char * func();//一个返回值为指向char的指针的函数
char (* funcp) func1();//一个指针,该指针指向一个返回类型为char的函数
char (* funcps[3]) func2();//一个数组,共3个元素,每个元素是一个指针,指针指向一个返回值为char的函数
typedef与这三个运算符结合
typedef int array5[5];
typedef array5 * p_to_array5;
typedef p_to_array5 arrayp[10];
array5 foo;//foo是一个int[5]数组
p_to_array5 p;//p是一个指向int[5]数组的指针
arrayp array;//array是一个数组,共10个元素,每个元素是一个p_to_array5指针
函数与指针
指针可以指向函数。指向函数的指针保存着函数代码起始处的地址。当声明一个函数指针时,必须声明它指向的函数类型,即指定函数的返回类型以及函数的参量类型。
void eat(char * food);声明了一个形式参量为字符指针的的函数,要声明一个指向这样类型函数的指针,需要这样做:
void (* pointer) (char *);
声明一个指向特定函数类型的指针,首先声明一个该类型的函数,然后用
(* pf)形式的表达式替换函数名称,pf就成为了可指向那种类型函数的指针了。
声明了指针之后,还需对指针进行赋值,赋值给指针的函数必须拥有与指针声明中一致的形参和返回值。
函数指针作为参数
有了函数的指针,可以利用指针来访问函数:
- 通过
(*pf) (参数)的方式访问函数 - 通过
pf (参数)的方式访问函数
#include <stdio.h>
void toUpper(char *);
void toLower(char *);
void foo( void (*pf)(char *),char * string);
int main() {
void (*pf) (char *);
char test[] = "I love you";
pf = toUpper;
(* pf)(test);//1
pf = toLower;
pf(test);//2
foo(pf,test);//foo函数调用
}
/*
* foo接受一个函数指针与char指针
*/
void foo( void (*pf)(char *),char * string){
pf(string);
puts(string);
}
C Primer Plus--结构和其他数据类型(2)的更多相关文章
- C Primer Plus--结构和其他数据类型(1)
目录 结构变量 structure variable 建立结构声明 定义结构声明 结构数组 嵌套结构 结构指针 使用指针访问结构成员 结构用于传参 在结构中使用指针的危害 联合(Union)数据结构 ...
- MySQL 性能优化--优化数据库结构之优化数据类型
MySQL性能优化--优化数据库结构之优化数据类型 By:授客 QQ:1033553122 优化数字数据(Numeric Data) l 对于唯一ID或其它可用字符串或数字表示的值,选择 ...
- 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件
一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...
- 【转】简单了介绍js中的一些概念(词法结构) 和 数据类型(部分)。
1 , javascript字符集: javascript采用的是Unicode字符集编码. 为什么要采用这个编码呢? 原因很简单,16位的Unicode编码可以表示地球人的任何书面语言.这是语言 国 ...
- The Way to Go读书笔记_第4章_基本结构和基本数据类型
“_”标识符 _ 本身就是一个特殊的标识符,被称为空白标识符.它可以像其他标识符那样用于变量的声明或赋值(任何类型都可以赋值给它),但任何赋给这个标识符的值都将被抛弃,因此这些值不能在后续的代码中使用 ...
- MySQL表结构(含数据类型、字段备注注释)导出成Excel
方法一: 1.用的是Navicat Premium,可以换成任意图形化客户端 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHAR ...
- hibernate学习笔记(1)结构与基本数据类型
一,概览 Hibernate负责从Java类到数据库表的映射,以及从Java数据类型到SQL数据类型的映射.另外还提供数据查询和检索功能.它可以显着减少在SQL和JDBC中手动处理数据的开发时间. ...
- 关于OC中直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型
关于OC直接打印结构体,点(CGRect,CGSize,CGPoint,UIOffset)等数据类型,我们完全可以把其转换为OC对象来进项打印调试,而不必对结构体中的成员变量进行打印.就好比我们可以使 ...
- C++之 自定义数据类型 枚举、结构体、共用体
1.枚举 枚举类型的声明形式为: enum 枚举类型名 { 变量值列表 }; 变量值列表里都是整型变量,另外不要忘记最后面的分号! 比如,enum weekday { sun, ...
随机推荐
- (转)微服务_创建一个简单的Eureka注册中心
原文地址:https://www.cnblogs.com/lplshermie/p/9105329.html 微服务和分布式已经成了一种极其普遍的技术,为了跟上时代的步伐,最近开始着手学习Spring ...
- java之spring mvc之文件上传
目录结构如下: 注意,下面说的配置文件,一般都是值的src下的配置文件,即mvc.xml.如果是web.xml,则直接说 web.xml 1. 文件上传的注意点 表单必须是post提交,必须将 enc ...
- Win10家庭版升级到企业版的方法
一.家庭版升级企业版 1.右键单击[此电脑]——>属性 2.点击更改产品密钥 3.输入密钥:NPPR9-FWDCX-D2C8J-H872K-2YT43 4.点击下一步,验证结束后点击开始升级,然 ...
- 关于MVC接收Ajax调用无法访问的问题
例如:下面代码有两个int类型的参数,如果Ajax调用时没有在data属性中为其赋值,AJAX会出500异常. public JsonResult GetList(int pageIndex, int ...
- 2019-07-24 require 和 include的区别
require 和 include 都是文件引入的常用用法.那他们有什么区别吗? 首先我们创建一个需要引入的文件叫做test.php,里面写上简单的一行代码: echo "我是要被引入的文件 ...
- 十二、vue中watch原理
1.普通的watch 2.对象属性的watch: 对象和数组都是引用类型,引用类型变量存的是地址,地址没有变,所以不会触发watch.这时我们需要进行深度监听,就需要加上一个属性 deep,值为 ...
- 【GLG Toolkit 行业案例】Baltic Information Systems, Ltd.公司选择使用GLG Toolkit
BIS (Baltic Information Systems, Ltd.)是一家专门为核电厂开发安全和过程监控系统的软件公司. BIS的新产品 BISMARC 是一个通用过程控制和监控的SCADA系 ...
- oracle之PLSQL导出-导入-表-存储过程等操作--亲测好用
1.背景 实际开发中考虑到安全,不会将生产库的数据和本地开发数据进行同步操作,而是采用导入导出sql语句的方式操作; 例如在开发环境写好的存储过程要更新到生产环境,那么就需要使用导出和导入功能. 2. ...
- es截取指定的字段返回
SearchResponse response = client.prepareSearch(index_name).setTypes("lw_devices") .setFrom ...
- linux档案和目录管理(后续)
资料来自鸟哥的linux私房菜 四:档案和目录的预设权限和隐藏权限 umask:预设权限,相比与chomd的4,2,1权限,档案满分为666,目录满分为777,umask可以预设消除部分权限,比如一个 ...