最近看《C专家编程》的时候,看到了以前项目中遇到的一些陷阱,遗憾没有及时总结下来,彻底搞清楚,出来混,总是要还的。多总结,多思考,多写。
用途一:类型别名
定义一种类型的别名,不只是简单的宏定义,而且可以同时定义多个对象。
char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
// 和一个字符变量。宏定义亦不能这样。
以下则可行:
typedef char* PCHAR;
PCHAR pa, pb;
但不同于define的是,不能用其他类型说明符对其扩展,如下:
#define peach int
unsigned peach i; //没问题
typedef int banana;
unsigned banana i; //错误,非法
用途二:结构别名
struct my_tag
{
int x;
int y;
};
struct my_tag p1;
而在C++中,则可以直接写:结构名对象名,即:my_tag p1;
typedef struct my_tag //struct tag
{
int x;
int y;
}my_type; //struct type
struct my_tag p1;
my_type p2; // 这样就比原来少写了一个struct,比较省事,尤其在大量使用时
用途三:函数指针
-
1.简单的函数指针的应用
形式:返回类型(*函数名)(参数表)
int (*pf)(int);
int g_Fun(int a){ return a*a;}
void main()
{
pf = g_Fun;
cout << (*pf)(2);
}
-
2.使用typedef更直观更方便
形式:typedef 返回类型(*新类型)(参数表)
typedef int (*pf)(int);
pf pf_Fun;
int gFun(int a){ return a*a;}
void main()
{
pf_Fun = gFun;
cou<<(*pf_Fun)(2);
}
-
3.代码示例如下:
#include <stdio.h>
#include <iostream>
#include <assert.h>
using namespace std;
//定义函数指针
typedef int (*pf_call)(int, int);
// +
int add(int a, int b)
{
return a + b;
}
// -
int subtraction(int a, int b)
{
return a - b;
}
// *
int multiplication(int a, int b)
{
return a*b;
}
// /
int division(int a, int b)
{
return b == 0 ? INT_MAX : a / b;
}
//定义一个函数,参数为op,返回一个指针,该指针类型为拥有两个int参数、
//返回类型为int的函数指针。它的作用是根据操作符返回相应函数的地址
pf_call func_call(char op)
{
switch (op)
{
case '+':
return add;
case '-':
return subtraction;
case '*':
return multiplication;
case '/':
return division;
default:
return NULL;
}
return NULL;
}
//s_calc_func为函数,它的参数是 op,
//返回值为一个拥有两个int参数、返回类型为int的函数指针
int(*s_calc_func(char op))(int, int)
{
return func_call(op);
}
//最终用户直接调用的函数,该函数接收两个int整数,
//和一个算术运算符,返回两数的运算结果
int calc(int a, int b, char op)
{
pf_call fp = func_call(op);
int(*s_fp)(int, int) = s_calc_func(op);
assert(fp == s_fp);
if (fp)
//下面两种方式都可,都是函数指针的方式
//return (*fp)(a, b);
return fp(a, b);
else
return INT_MIN;
}
int main()
{
int a = 100, b = 0;
printf("calc(%d, %d, %c) = %d \t\n", a, b, '+', calc(a, b, '+'));
printf("calc(%d, %d, %c) = %d \t\n", a, b, '-', calc(a, b, '-'));
printf("calc(%d, %d, %c) = %d \t\n", a, b, '*', calc(a, b, '*'));
printf("calc(%d, %d, %c) = %d \t\n", a, b, '/', calc(a, b, '/'));
system("pause");
return 0;
}