//
// 0731结构体指针总结.h
//----------------结构体指针
结构体指针 间接访问成员值
其访问的一般形式为:(*结构指针变量).成员名
1、结构体变量的才成员值
struct Student{
int age;
char *name;
};
struct Student stu1={18,"zhangsanfeng"};
结构体变量的成员值有2个
//stu1.age 值 18
//stu1.name 值 zhangsanfeng
2、用结构体指针间接的访问结构体变量的成员
struct Student *p=&stu1;
//使用p获取 18 zhangsanfeng
有两种方法
1)(*p).age 访问年龄
(*p).name 访问姓名
2)p->age 访问的年龄
p->name 访问的姓名
**************************************************
结构体的嵌套使用
之前学过的嵌套
1)if(){
if(){
}
}
2) ( ? :)? :
3) for(){
for(){
}
}
4)递归函数勉强算嵌套
5)max(max(),45);
结构体的嵌套 :
结构体定义中,结构体的成员又是另外一个结构体类型
结构体嵌套的注意事项:
1)结构体定义中可以嵌套其他结构体类型的变量
但不可以嵌套自己这个类型的变量
//定义一个Date的结构体
struct Date{
int year;
int month;
int day;
};
//定义了一个Student的结构体
struct Student{
char *name;
int age;
float score;
//Struct Student stu; //这个是错误的 ,不可以嵌套自己这个类型的变量
struct Student *stu;//这个是正确的
struct Date birthday;//这是一个嵌套
}
1.嵌套的结构体如何初始化
struct Student stu1={"张三丰",28,59.99f,{1200,12,12}};
若要单独给 stu1.birthday赋值,
stu1.birthday=(struct Date){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.结构体嵌套自身的指针
struct Person{
char *name;
int age;
//嵌套自己类型的指针
struct Person *child;
};
//结构体嵌套自身指针的初始化
struct Person kim={"kim",8,NULL};
//struct Person *child =&kim;
sturct Person p1={"林志颖",38,&kim};
//结构体嵌套自身指针的访问
printf("%s的儿子是:%s,小孩年龄是%d\n",p1.name,(*p1.child).name,(*p1.child).age)
printf("%s的儿子是:%s,小孩年龄是%d\n",p1.name,p1.child->name,p1.child->age);
**********************************************************
结构体变量及成员作为函数的参数
//定义结构体
struct Car{
int lunzi;
int speed;
};
//1、用结构体变量的成员值作为函数的参数,实质是值传递
void xiuche(int n){
n=2;
}
//2、结构体变量作为函数的参数 实质上还是值传递
void xiuche1(struct Car c1){
c1.lunzi=2;
}
//注意:用结构体变量的地址传递给函数
// 也可以理解为用结构体指针作为函数的参数 是地址传递
void xiuche2(struct Car *c1){
c1->lunzi=2;
}
struct Car car1={4,200};
xiuche(car1.lunzi);
//1、用结构体变量的成员值作为函数的参数,实质是值传递
printf("%d\n",car1.lunzi);
//2、结构体变量作为函数的参数 实质上还是值传递
xiuche1(car1);
printf("%d\n",car1.lunzi);
//注意:用结构体变量的地址传递给函数
// 也可以理解为用结构体指针作为函数的参数 是地址传递
xiuche2(&car1);
printf("%d\n",car1.lunzi);
**********************************************************
枚举类型
C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内
枚举类型的定义:
enum 枚举类型名{
枚举值1,枚举值2,...
};
枚举不可以嵌套定义
**********************************************************
枚举类型的变量
//1、枚举类型变量的定义
enmu iColor{kIcolorWhite,kIcolorBlack,kIcolorTHJ};
1)先定义枚举类型,再定义枚举变量
enum 枚举类型名 枚举变量名列表;
enum iColor iPhoneColor;
2)定义枚举类型的同时,定义变量
enum Sex{kSexMan,kSexWomen,kSexYao} isex;
//2、枚举类型变量的初始化
//给枚举变量赋值
iPhoneColor=kIcolorBlack;
//3、枚举变量值如何使用
printf("%d\n",iPhoneColor);
//4、枚举变量的值
枚举类型定义完成以后,系统会自动给枚举的每个元素赋值一个整型的初值
默认初值:从第一个元素开始值为0,以后每个元素的值,是上一个元素的值加1
**********************************************************
typedef 关键字介绍
typedef就是给别人给外号的
定义:
typedef 原类型名 新类型名
typedef 给五种数据类型起别名
//-----------1.给基本数据类型
typedef int MALATANG;
//-----------2.用在数组,给数组起别名
typedef int ARRAY[5];//定义数组长度为5的数组类型
ARRAY a1,b1;//等同于 int a1[5],b1[5];
//-----------3.给结构体起别名
struct Person{
char *name;
int age;
};
struct Person p1={"zbz",18};
//给struct Person 起个别名 P
typedef struct Person P;
//用别名定义新的变量
P p2={"sdf",28};
typedef struct Car{
int lunzi;
int speed;
}MYCAR;//表示把结构体起个别名 MYCAR
MYCAR car1={1,200};
//给匿名结构体起个别名
typedef struct {
int screenSize;
int ram;
}IPHONE;
//---------------4.给枚举类型起别名
typedef enum Sex{
kSexMan,
kSexWomen,
kSexYao
}ISEX;//ISEX是别名
//给匿名枚举类型取别名
typedef enum{
zhouyi,
zhouer,
zhousan
}WEEKDAY;//WEEKDAY是别名
//----------------5.给函数指针起别名
函数指针:指向函数的指针,
定义:int(*p)(int,int);//函数指针
//给函数指针起别名
typedef int(*FUN)(int,int);//FUN是一个别名
FUN f1,f2;//f1 f2都是函数指针。
**********************************************************
预处理指令的概念及分类
以“#”开头的都叫做预处理指令
//----------------宏的概念及无参宏定义方法
宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,
“宏”分为有参数和无参数两种。本节讨论无参数宏。
1.宏 概念: C 语言中我们自定义的特殊标示符,习惯大写
2.宏 定义:
无参宏的宏名后不带参数。其定义的一般形式为:
#define 标识符 字符串
注意: 预处理指令,经常写在函数之前。
3.宏替换
源程序在编译之前,由预处理程序对我们写的源代码进行处理,会把源代码中所有出现 宏名的地方一律使用 宏的字符串 去替换
4.宏使用的注意事项
1)宏是有作用域的 可以使用#undef 取消宏定义
2)在字符串中出现的宏名不会被替换
3)宏定义运行嵌套
#define R 4
#define PI 3.14
#define AREA PI*R*R
4)使用 宏起别名
#define INT1 int
INT1 a;
a=10;
//-------------------有参宏的定义和使用
定义方法
无参宏 #define M 10
有参宏
#define SUM(a) a+a
#define M1(x,y) x*y+x+y
int result =SUM(3);
printf("result=%d\n",result);//结果为 6
int result =M1(4,5);
printf("result=%d\n",result);//29
//---------------有参宏的使用注意事项
1.宏的形参与形参之间可以出现空格,但是宏名和形参之间不能出现空格
2.有参宏 宏的参数最好括起来
#define M1(x ,y) x*y+x+y
int a = 3;
result = M1(a+3, a-1);
//(x ,y) x*y+x+y
// 6*2 +6+2
// 20 错误的
// a+3*a-1+a+3+a-1
// a+9 -1+a+3+a-1
// 3+9-1+3+3+3-1
// 19 这个才是正确的
#define M1(x ,y) (x)*(y)+(x)+(y)
3.可以用宏来定义多个语句
#define M3(m,n) m = a+2;n=a*2;
int a = 3;
int i,j;
printf("%d\n",result);
printf("i=%d,j=%d\n",i,j);//0 0
M3(i, j);
printf("i=%d,j=%d\n",i,j);// 5 6
//-----------------使用有参宏求最大值
//定义一个有参宏,求两个数的最大值
#define MAX(a,b) a>b?a:b
//调用有参宏
int m = MAX(34, 2);
printf("%d\n",m);
|
|