C Primer Plus–结构和其他数据类型(2)
文章目录
- 枚举类型 enumerated type
- 枚举默认值
- 为枚举指定值
- 命名空间 namespace
- `typedef`关键字
- `*` `()` `[]`修饰符
- `typedef`与这三个运算符结合
- 函数与指针
- 函数指针作为参数
枚举类型 enumerated type
枚举是用来代表整数常量的符号,枚举类型的声明与struct声明类似。枚举常量都是int
型的。枚举声明的花括号内枚举了该类型变量可能有的值。枚举是为了增强程序的可读性。
1
2enum vehicle {bicycle,car,plane,train,ship};
上面说了枚举类型就是int
类型的常量,那么凡是可以使用int
的地方都可以使用枚举常量。
枚举默认值
枚举列表中的默认值被指定为整数值0、1、2等等。如上面枚举声明中:
bicycle
、car
、plane
、train
、ship
的值依次为0 1 2 3 4
。
为枚举指定值
1
2
3
4enum levels {low = 20, medium = 50, high = 80, perfect = 100}; enum phones {ios, windowsPhone = 60, blackberry = 80, android}; //ios = 0; android = 81
在C中,允许对枚举类型的变量使用自增(++)或自减(–)符号,但是在C++中不允许,为了使得程序兼容,应该一开就将变量声明为int
型。
1
2
3
4
5
6
7
8
9enum vehicle {bicycle,car,plane,train,ship}; enum vehicle trans; //在C++中要声明为 //int trans; //trans此时的值不确定,需要赋值 for (trans = bicycle; trans <= ship ; trans++) { printf("%dn",trans); }
命名空间 namespace
在C中,变量名和标记名(结构标记、联合标记、枚举标记)不在同一个命名空间中,因此二者可以同名,但在C++中不可以。
1
2
3
4
5
6
7struct car { char brand[30]; int litre; }; int car = 0; //C中不冲突
typedef
关键字
typedef
工具是一种高级数据特性,他使您能够为某一类型创建您自己的名字。在这个方面,它和#define
相似,但是它们具有三个不同之处:
- 与
#define
不同,typedef
给出的符号名称仅限于对类型,而不是对值 typedef
的解释由编译器而不是预处理器执行- 虽然它的的范围有限,但在其受限范围内,
typedef
比#define
更灵活
这里就告诉我们typedef
并不创建新的数据类型,只是创建了易于使用的标签别名。
例:顶一个一个数据类型别名BYTE
,它只占一个字节,可以先定义一个char
变量BYTE
,然后在前面加上typedef
即可。
1
2
3
4
5
6typedef unsigned cahr BYTE; BYTE x;//定义一个x BYTE Y[10];//定义一个数组容纳十个BYTE BYTE * z;//定义一个指向BYTE的指针
总之,#define
只是由预处理器对文件里的字符进行替换,而typedef
则新建了一种数据类型的代替。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15typedef 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
:
1
2typedef char (* FRPTC())[5];
这里FPRTC
返回的是一个指向含有5个元素的char
数组的指针。
*
()
[]
修饰符
这三者优先级有低到高:* < () = []
,而且他们与变量名的结合是从左到右的。
1
2
3
4
5
6
7
8
9
10
11
12
13int 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
与这三个运算符结合
1
2
3
4
5
6
7
8typedef 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 (参数)
的方式访问函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#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内容请搜索靠谱客的其他文章。
发表评论 取消回复