预编译、类型定义、static、extern及函数指针

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、函数调用中*两边的括号不能少,另外,*只是一个符号,不能认为是取值运算。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值