C语言基础学习(七)

预处理: 处理由#开头的语句
1: 文件包含 #include
#include < > 表示文件是在系统默认的目录中
#include “ ” 表示文件是指定目录

在头文件中定义函数会怎样? 如果有多个文件都包含了同一个头文件,容易出现函数重定义
原因是include的文件会被展开

一般头文件中放的是类型定义、全局变量和函数的外部调用声明(extern)

2: 条件编译
#if 条件
如果条件为真 ,则把该语句编译进去,否则不编译
#endif

#if 条件
如果条件为真 ,则把该语句编译进去,否则不编译
#else
如果条件不为真 ,则把该语句编译进去,否则不编译
#endif

条件编译和宏的组合
#if NUM==10
// #else
#endif

#ifdef 宏名
如果有对应的宏定义,则编译该语句, 否则不编译
// #else
// 如果没有对应的宏定义,则编译该语句, 否则不编译
#endif

#ifndef 宏名
如果没有对应的宏定义,则编译该语句, 否则不编译
#endif

3: 宏定义 在非条件判断时候就是一个替换
自定义:
#define NUM 10 就表示定义了一个有值的宏NUM , 值为10
#define GEC210 表示定义了一个无值的宏 GEC210
gcc -E -o KEY_name_system.e KEY_name_system.c -DDEBUG
DEBUG 是个宏名
编译环境已定义
GNU-C
FUNCTION 当前函数名
LINE 所在的行数
TIME 当前预编译的时间
FILE 当前文件名

#define apple int *
定义了一个宏apple 它等价于int *
apple a , b ; 相当于 int * a, b ;
int *a , int b ;

typedef int * apple ;
定义了一个int 类型 apple, apple是int的别名
apple a , b; 定义了两个int *类型的变量a b
int * a; int *b

#define max(a, b) ((a)>(b)? (a) 😦 b))

#define max(a , b, temp) {
if(a > b)
temp = a;
else
temp = b;
}
带参数的宏定义可以忽略类型

熟悉以上操作和验证过程
如何在一个代码中使用宏 判断一个数或者表达式和0的大小关系

#define check(a ) {
if( (a) > 0)
printf(“ large than 0 \n”);
}

递归函数
函数自己调用自己

计算 1+2 +3 +。。。 +n n是从键盘的输入
cnt = 0;
for(i = 0; i< =n ;i++)
{
cnt +=1;
}

写一个函数可以实现的功能是1+2 +3 +。。。 +n ,要求使用上函数的递归调用

main:
sum = func( n);

int func( int n)
{
if(n == 1)
return n;
else
return ( n + func(n-1));
}

递归函数要注意:
1: 不要在递归过程中申请大空间,容易造成栈溢出
2: 代码量也要尽可能精简
3: 要有结束递归的条件 也就是在某种条件下就不要再递归了

带参数的main函数
int main(int argc, char *argv[])
{
argc表示总参数个数, 包括了可执行文件名
argv是指针数组名, 由char *组成 ,
argv[0]表示执行文件名对应的字符串
argv[1] … argv[argc -1] 表示在命令行输入的各个参数, 都是字符串

如果argv[1]输入的是“100”. 这个是字符串 需要使用atoi转换成是数字
atoi(argv[1]) 得到数字100
需要增加 stdlib.h这个头文件
}

内联函数 C99
可以节约系统调用函数花费的时间
inline函数 建议编译器尽快调用该函数 但是编译的最终效果是编译器以及当前决定的
内联函数是没有地址的

内核链表 内联函数
简单实现
inline int func(void )

typedef int * handle_t( int );
int * handle_t( int ); 定义了一个指针函数, 返回值为指针int *类型, 参数为int
typedef int * handle_t( int ); 定义了一个指针函数类型 函数的返回值为指针int *类型, 参数为int

typedef int (* handle_t)( int );
int (* handle_t)( int ); 定义了一个函数指针, 返回值为指针int类型, 参数为int
typedef int (* handle_t)( int ); 定义了一函数指针类型 函数的返回值为int 类型, 参数为int

void (*signal (int sig, void (*func)(int)) ) (int); 返回值是函数指针的函数
void *signal (int sig, void (func)(int)) 返回值为void的函数, 参数有两个
void (*signal (int sig, void (*func)(int)) ) (int);
返回值为void(*p)(int)函数指针的函数,形参 (int sig, void (*func)(int))
func是个函数指针,指向的函数是返回值为void , 形参为int
typedef void (*sighandler_t)(int);
定义了一个函数指针类型 sighandler_t, 所指向的函数是返回值为void , 形参为int
sighandler_t signal( int sig, sighandler_t func);
函数signal 返回值为函数指针, 形参:1个int ,1个是函数指针
函数指针指向的函数都是返回值为void, 形参为int的

数组指针数组
int (* arg[10]) [4]
由10个 int [4]类型的指针构成的数组

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章