黑马程序员-----------C语言基础-----------预处理指令

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:结构体数组的概念及定义
1.结构体数组的概念:

2.结构体数组的定义
定义格式:

struct 结构名{


成员表列


}数组名[数组长度];


例子 :定义一个长度为5的数组,其中每个元素都是stu结构类型
方法一:定义结构体的同时,定义数组
struct stu{
int num;
char *name;
char sex;
float score;
}boy[5];


方法二:先定义结构体,后定义数组
struct Student boy[5];


二:结构体数组的初始化和遍历
1.结构体数组的初始化
struct stu{
int age;
char *name;

};
1)定义的同时进行初始化
struct stu s[2] = {{12,"sb"},{18,"xiaoming"}};

2)先定义,后初始化,整体赋值
s[1]=(struct stu){23,"xiaoming"};

3)先定义,后初始化
s[1].age = 12;
strcpy(stu[1].name,"xxoo");


2.结构数组的遍历
for(int i=0;i<3;i++){

printf("name:%s,age:%d\n",boys[i].name,boys[i].age);

}


思考与实现1:



重点代码:
float sum = 0.0f;
	int count=0;
	for(int i=0;i<5;i++){
		sum += boy[i].score;
		if(boy[i].score<60)
		{count++;}
		else if(boy[i].score>=80 && boy[i].score<=100){	
		
			printf("姓名:%s,成绩:%.2f\n",boy[i].name,boy[i].score);	
		}


	}
	
	printf("平均值:%.2f\n",sum/5);
	printf("不及格人的个数:%d",count);



三:应用:实现简易通讯录
1)用结构体数组实现通讯录

思路:
定义一个结构体,姓名  电话号码


让用户从键盘输入要保存的姓名和电话号码


输入完成后,可以打印出来


代码实现:
#include <stdio.h>
	#define LEN 5


	struct Person{	


		//定义数组保存联系人姓名
		char name[21];
		//定义手机号码
		char telNum[12];


		}contacts[LEN];


	int main(){	


	//先定义结构体


	//定义结构体数组


	//让用户输入要保存的联系人信息
	printf("请输入要保存的联系人,格式:姓名 电话\n");
	for(int i=0;i<LEN;i++){	


	scanf("%s %s",contacts[i].name,contats[i].telNum);


	}
	//保存后立即查看
for(int i=0;i<LEN;i++){	


	printf("%s %s\n",contacts[i].name,contats[i].telNum);


	}
	return 0;
	}


四:结构体指针的定义和初始化
1.指向结构体变量的指针
结构体指针变量说明的一般形式:
struct 结构体名  *结构体指针名;
注:如果boy是被说明为stu类型的结构变量,
则:
pstu = &boy
是正确的,而:
pstu = &stu
是错误的。
2.要会区分结构体名,结构体变量名,结构体指针。

3.结构体指针间接访问成员变量的值
其访问的一般形式:
(*结构体指针变量).成员名
或为:
结构体指针变量->成员名
例如:
(*pstu).num
或为:
pstu->num


五:结构体嵌套使用
1.结构体的嵌套使用方法
1)成员也可以是一个结构体
//结构体嵌套:结构体定义的里面有其他结构体
//结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针


例如:

2.对嵌套结构体成员的访问
1)嵌套结构体如何进行初始化
struct Student stu1 = {"张三丰",28,2,99f,{1200,12,12}};
2)嵌套的结构体如何进行访问
printf("姓名:%s,年龄:%d(生日:%d-%02d-%02d),成绩:%.2f \n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.score);


3)结构体嵌套自身的指针:


4)结构体嵌套自身指针的访问:

六:结构体变量及成员作为函数参数
1.成员值作为函数参数
  结构体成员属性作为函数的参数就是值传递(成员变量是数组除外)
2.结构体变量名作为函数参数:



3.结构体指针作为函数参数是地址传递


七:枚举类型的介绍及定义
1.枚举类型:


2.枚举类型定义的一般形式:

enum 枚举类型名{枚举值1,枚举值2,枚举值3....};


3.枚举变量
例:
1)先定义枚举类型,再定义枚举变量
enum weekday{sum,mou,tue,wed,thu,fri,sat};
entu weekday day1,day2;

2)定义枚举类型的同时定义枚举变量
enum weekday2{sum,mou,tue,wed,thu,fri,sat} day3,day4;

4.枚举变量的值
    默认情况:0   1   2   3   4   5   6
enum weekday2{sum,mou,tue,wed,thu,fri,sat} day3,day4;
      0   3     4   5   6   7   8
enum weekday2{sum,mou=3,tue,wed,thu,fri,sat} day3,day4;


八:typedef关键字的介绍
1.typedef的概念及语法格式
   C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。
typedef定义的一般形式为:

typedef  原类型名  新类型名;

*其中原类型名中含有定义部分,新类型名一般用大写表示,以便区别。


*有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的。

2.typedef的使用方法
1)给基本数据类型起别名

typedef int INT;

2)给数组起别名

typedef int ARRAY[5]; //定义长度为5的数组
ARRAY a1,a2; //相当于 int a1[5],a2[5];


3)给结构体起别名
方法一:
struct Person{


char *name;
int age;
};
struct Person p1 = {"zbz",18};
//给struct Person起一个别名 P
typedef struct Person P;

方法二:
typedef struct Person{


char *name;
int age;
}P; //表示把struct Person类型起了一个别名 P。


方法三:
typedef struct {


char *name;
int age;
}P; //给匿名结构体起了一个别名 P。


4)给枚举类型起别名
typedef enum Sex{Man,Woman,Yao} ISEX; //ISEX是一个别名
或者:
typedef enum Sex ISEX;


5)给函数指针起别名
函数指针的定义:
int sum(int a,int b){

return a+b;
}

int (*p)(int a,int b); //这是一个函数指针
//下面是给函数指针起别名
typedef int (*FUN)(int ,int);   //FUN是一个函数指针别名
//使用别名、
FUN f1,f2;
f1 = sum;
printf("%d\n",f1(23,43));


九:预处理指令的概念及分类
1.基本概念
*以#开头的预处理命令,如包含命令#include,宏定义命令#define等,在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称 为预处理部分

十:宏的概念及无参宏定义方法
1.宏的概念:


2.无参宏:


3.无参宏使用注意事项:

4.有参宏的定义方法
#define 宏名(形参表)  字符串
调用有参宏:
宏名(实参表);


例子:
#define M(y) 3*y+6*y

int sum = M(3);

有参宏使用注意事项:
1)宏的形参之间可以有空格,但宏名和形参之间不能出现空格
2):

4)在宏定义中,字符串内的形参通常要用括号括起来以避免出错,在上例中的宏定义中(y)*(y)+3*(x)+3*(y)表达式的x,y都用括号括起来。
5)宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。

应用:使用有参宏求两个数最大值
#define MAX(a,b) a>b?a:b

int m = MAX(34,55);


十一:typedef和#define的区别

#define INT1 int //宏定义,只是替换
typedef int* TINT; //别名定义

INT1 a,b;     //相当于int *a,b其中a是指针,b是普通变量
TINT a,b;     //相当于int *a;int *b;


十二:条件编译的概念
1.条件编译:发生在预处理阶段,在编译之前做的事情;
核心:根据条件编译指定的代码,不需要编译的代码不进行编译;
条件不同,编译的部分也不同,生成的目标文件(.o)大小也不一样。

2.#if-#elif-#else-#endif条件编译指令(判断的是宏定义常量表达式)
第一种形式的格式:
#if  常量表达式1
程序段1
#elif 常量表达式2
程序段2
#elif 常量表达式3
程序段3
#else 常量表达式4
程序段4
#endif

3.#ifdef条件编译指令用来判断某个宏是否定义
int a=0;
#ifdef DEBUG1       //检查DEBUG1是否定义,注意DEBUG这个宏系统已经定义
a  = 10; //若定义a=10
#else
a=10000; //若没定义a=10000
4.ifndef 检查宏是否定义  ifndef 如果没有定义
int a=0;
#ifndef DEBUG1 //若没定义a=10
a  = 10;
#else //若定义a=10000
a=10000;


十三:使用条件编译指令调试bug
应用:可变参数宏,更方便地打印调试信息
条件编译指令调试BUG:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值