您的位置:首页 > 编程语言 > C语言/C++

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

2015-09-11 16:56 543 查看
------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:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: