1、宏定义
// 不带参数的宏定义
#define pai=3.14int main()
{
int a;
int r=6;
a=2*pai*r// 编译前会被替换为 3.14
return 0;
}
// 带参数的宏定义
#define pingfang(a) (a)*(a);
int main()
{
int res = pingfang(5+5); // 编译前会被替换为 int res = (5+5)*(5+5)
return 0;
}
注意:
1、宏定义只会影响他后面的语句,它前面的不会被替换;
2、带参数的宏定义需要将参数和结果都加上(), 否则会出现错误; #define pingfang(a) (a*a);替换后就会变成5+5*5+5
2、条件编译
在编译前进行判断那段代码需要编译 那些不需要编译
#ifndef _WR_H_
#define _WR_H_
#include "wr.h"
#end if
二、static和extern
static:
函数 文件级私有函数,被其他文件包含了也不能使用
全局变量 文件级私有的全局变量,被其他文件包含了也不能访问
局部变量 函数内部的静态变量,函数被销毁该变量依然存在直到程序结束
extern:
全局函数 被其他文件包含了可以使用,默认情况下就是extern所以extern关键字可以省略而且不能有相同的函数民
全局变量 声明一个全局变量,默认情况下就是extern所以extern关键字可以省略,如果定义了相同的变量名那么他们是同一个变量
三、typedef
给已经存在的类型起一个新的名称
// 基本数据类型
typedef int MyInt;
// 指针
typedef char * String;
// 结构体
typedef struct
{
char *name;
int age;
} Person;
// 枚举
typedef enum {
Man,
Woman
} Sex;
// 指向函数的指针
typedef int (*MyPoint)(int, int);
指针函数:
(1)定义:返回值为一个某一类型指针的函数称为指针函数。
(2)格式:类型说明符* 函数名(形参列表);*表示返回值为一个指针或地址。
(3)程序示例如下:
#include<stdio.h>
int* max(int x,inty)
{
return x>y?x:y;
}
int main(int argc,const char* argv[])
{
int a=3,b=4;
int *p=max(3,4);
printf("%p\n",p);
return 0;
}
该函数打印输出p的地址,该函数属于值传递。
函数指针:
(1)定义:存放函数首地址的指针变量就是函数指针
(2)格式:类型说明符 (*变量名)(函数的参数列表);
(3)程序示例如下:
#include <stdio.h>
int sum(int x,int y)
{
return x+y;
}
int main(int argc, const char * argv[])
{
int s=0;
int (*p)(int a,int b); //定义函数指针
p = sum; //给函数指针赋值,p指向sum,sum存的就是函数的首地址。
s = p(23,34);
printf("%d\n",s);
return 0;
}
该函数打印输出结果为57。
注意:
1、函数指针变量不能进行算术运算,这是与数组指针不一样的。
2、函数调用中*两边的括号不能少,另外,*只是一个符号,不能认为是取值运算。