C_Language_10
C_Language_10
结构体:由一系列具有相同类型或不同类型的数据构成的数据集合,是一种自定义数据结构
示例:
定义:typedef struct teacher{
char name[20];
int age;
}Teacher;
Teacher t1 = {"zhangsan",12};//赋值
t1.age = 20;//修改元素值
strcpy(t1.name, "wangwu”);
printf("%s %d\n",t1.name,t1.age);//访问元素
结构体指针:指针指向结构体变量的存储单元,对结构体变量取地址,指针指向结构体的起始地址,即首个成员变量的地址
Teacher *p = &t1;//指向上述示例的结构体首地址
printf("%p %p\n",p,t1.name);//打印地址
通过结构体指针访问成员变量:
第一种方式:使用指针取值运算符
(*p).age (*p).name : (*p)表示指向结构体变量的存储单元
*p).name表示:p指向结构体变量中的成员变量name的存储单元
注意:()不能省略,因为 . 的优先级高于*
Teacher t2 = {"xiaoweiba",22};
Teacher *q = &t2;
printf("%s %d\n",(*q).name,(*q).age);
strcpy((*q).name, "wanghan");
(*q).age = 32;
printf("%s %d\n",(*q).name,(*q).age);
第二种方式:通过指向箭头访问(常用)
printf("%s %d\n",q->name,q->age);
Teacher t3 = {"lusi",24};
Teacher *r = &t3;
r->age = 34;
strcpy(r->name, "liuchen");
printf("%s %d",r->name,r->age);
//求两点距离
float distanceOfTwoPoint(Cpiont *p1,Cpiont *p2){
float dx = p1->x - p2->x;//x方向差值
float dy = p1->y - p2->y;//y方向差值
float distance = sqrtf(dx * dx + dy * dy);
return distance;
}
定义cpoint结构体类型的变量
typedef struct cpiont{
float x;
float y;
}Cpiont;
Cpiont point1 = {100,100};
Cpiont point2 = {103,104};
// 定义cpoint结构体类型指针 分别指向两个变量
Cpiont *p11 = &point1;
Cpiont *p22 = &point2;
// 计算两点间的距离
printf("\ndistance = %.1f\n",distanceOfTwoPoint(p11, p22));//调用求距离函数
指针与结构体:
运算符优先级 从高到低
[] -> . * &
访问数组元素的方式:
结构体对象.成员变量
结构体对象->成员变量
定义一个Student结构体数组,3个元素
Student stu[3] = {{1,"zhangsan",'m',17},
{2,"lisi",'f',18},
{3,"wangwu",'m',19}};
// 输出第一个学生的年龄
printf("%d\n",stu[0].age);
// 输出第二个学生的年龄
printf("%d\n",(*(stu+1)).age);
// 输出第三个学生的年龄
printf("%d\n",(*(stu+2)).age);
// 定义指针指向结构体数组,使用指针访问结构体数组元素
Student *p = stu;
for (int i = 0; i < 3; i++) {
// 使用指针方式访问成员变量
Student stu1 = *(p+i);
printf("%d %s %c %d\n",stu1.num,stu1.name,stu1.sex,stu1.age);
}
printf("----------------------\n");
for (int i = 0; i < 3; i++) {
printf("%d %s %c %d\n",(p+i)->num,(p+i)->name,(p+i)->sex,(p+i)->age);
}
printf("----------------------\n");
for (int i = 0; i < 3; i++) {
printf("%d %s %c %d\n",(*(p+i)).num,(*(p+i)).name,(*(p+i)).sex,(*(p+i)).age);
}
结构体指针作为函数的参数:在函数中操作结构体数组时,需要传入数组首地址和元素个数
使用指针查找学员数组中性别为男的学员,成绩增加10分(超过100分的记为100分)
student stu[5] = {{01,"liwei",'m',95.3},
{02,"zengxiaoxian",'m',95.3},
{03,"luziqiao",'m',75.3},
{04,"huyifei",'w',95.3},
{05,"tanyouyou",'w',97.3}};
student *p = stu;
for (int i = 0; i < 5; i++) {
if ((p+i)->sex == 'm') {
(p+i)->score += 10;
if ((p+i)->score > 100) {
(p+i)->score = 100;
}
}
}
for (int i = 0; i < 5; i++) {
printf("学号:%d 姓名:%s 性别:%c 分数:%0.2f\n",(*(p+i)).num,(*(p+i)).name,(*(p+i)).sex,(*(p+i)).score);
}
for (p = stu; p < stu+5; p++) {
printf("学号:%d 姓名:%-12s 性别:%c 分数:%0.2f\n",p->num,p->name,p->sex,p->score);
}
预编译:
预编译指令
预编译:即在编译之前做的操作
定义宏的时候不允许添加
#define 宏名 内容
宏名代表内容;程序预编译时,将代码中的宏替换为相应的内容
#define PI 3.14159267
float a = PI;
printf("%f\n",a);
#define kPrin printf("hello world\n")
kPrin;
使用已经定义的宏
#define W 3
#define H 5
#define S W*H
printf("%d\n",S);
带参宏定义
计算两个数相乘的结果
#define MUL(A,B) (A)*(B) //(A)*(B)括号不能省略
printf("%d\n",MUL(3,5));
宏只做替换
#define MUL(A,B) A*B //#define MUL(A,B) (A)*(B) //不一样
#define A 1+2
#define B 3+4
printf("%d\n",MUL(A,B)); //宏只做替换: 1+2*3+4 = 11
小结:
1.宏定义:指定一个字符(符号)代表一个字符串
2.PI:宏名
3.宏定义分类:有参数、无参数
4.宏定义没有(分号);
5.宏定义只在编译期将所有的指定字符,替换为对应的字符串
6.有参数的宏,先替换,再计算。名字和参数()之间不能有间隔 MUL(A,B)
7.宏不分配内存空间
8.宏消耗的是编译期的时间,函数消耗的是运行期的时间
9.不能做类型检测
10.一般定义主函数main函数前,做全局变量用
条件编译 第一种
#define INT 10
#ifdef INT
int a = 50;//宏定义过 INT 则 a= 50
#else
int a = 100;//宏没定义过 INT 则 a= 50
#endif
printf("a = %d\n",a);
条件编译 第二种
#define INT 10
#ifndef INT
int a = 50;//宏没定义过 INT 则 a= 50
#else
int a = 100;//宏定义过 INT 则 a= 50
#endif
printf("a = %d\n",a);
条件编译 第三种
#if 1 //表达式结果非0 编译期编译代码段1,否则编译代码段2
int a = 5;//代码段1
#else
int a = 10;//代码段2
#endif
printf("a = %d\n",a);
for (int i = 0; i < a; i++) {
for (int j = 0; j <= a; j++) {
printf("*****\n");
}
}

浙公网安备 33010602011771号