C 入门 第九节 结构体指针
typedef struct teacher
{
char name[30];
int age;
}Teacher;
typedef struct student
{
char name[20];
char sex;
int age;
}Student;
typedef struct student1
{
char name[20];
char sex;
int age;
float score;
}Student1;
int main(int argc, const char * argv[]) {
/*
Teacher t1 = {"zhangsan",18};
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指向结构体变量的存储单元 (*p).name表示:p指向结构体变量中的成员变量name的存储单元
注意: ()不能省略,因为 . 的优先级搞英语 *
Teacher t2 = {"lisi",22};
Teacher *q = &t2;
(*q).age = 32;
strcpy((*q).name, "zhaoliu");
printf("%s %d ",(*q).name,(*q).age);
// 第二种方式: 通过指向箭头访问(常用)
// q->age;
Teacher t3 = {"xiaohong",24};
Teacher *r = &t3;
r->age = 34;
strcpy(r->name, "xiaolv");
printf("%s %d\n",r->name,r->age);
*/ /*
练习 : 定义一个点坐标的结构体CPiont.包含俩个float成员 x,y
定义俩个CPiont结构体变量m,n 使用俩个结构体指针 分别指向m,n 然后通过指针计算俩点距离(提示:1.勾股定理 2.开放函数sqrt);
//定义cpoint结构体类型的变量
CPoint point1 = {3,4};
CPoint point2 = {7,8};
// 定义cpoint结构体类型指针 分别指向两个变量
CPoint *p11 = &point1;
CPoint *p22 = &point2;
// 计算两点间的距离
printf("distance = %.2f\n",distanceOfTwoPoint(p11, p22));
*/
#pragma marki ---------------指针与结构体数组的关系-----------
/* 运算符优先级 从高到低
[] -> . * &
定义一个student结构体数组,3个元素
Student stu[3] =
{
{"zhangsan",'m',17},
{"lisi",'m',18},
{"xiaohong",'f',16}
};
//结构体对象,成员变量
// 结构体对象->成员变量
//访问数组元素的方式
//输出第一个学生的年龄
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("%s %c %d\n",stu1.name,stu1.sex,stu1.age);
}
for (int i = 0; i < 3; i ++)
{
//使用指针法访问成员变量
printf("%s %c %d\n",(p + i) -> name,(p + i) -> sex,(p + i) -> age);
}
//结构体指针作为函数的参量
//在函数中操作结构体数组是,需要传入数组的首地址和元素个数
// 练习: 使用指针 查找学生数组中 性别为男生的学员,成绩加10分,(超过100分的记作100分)
Student1 stu[3] =
{
{"zhangsan",'m',17,86},
{"lisi",'m',18,93},
{"xiaohong",'f',16,95}
};
Student1 *p = stu;
for (int i = 0; i < 3; i ++)
{
if ((p + i) -> sex == 'm')
{
if ((p + i) -> score < 90)
{
(p + i) -> score = (p + i) -> score + 10;
}
else
(p + i) -> score = 100;
} printf("%s %c %d %.2f\n",(p + i) -> name,(p + i) -> sex,(p + i) -> age,(p + i) -> score);
}
*/
#pragma mark ----------预编译-------------
/*
预编译指令
预编译:即在编译之前做的操作
定义宏的时候不允许添加
#define 宏名 内容
宏名 代表 内容; 程序预编译时,将代码中的宏替换为相应的内容
#define pi 3.1415926 //没有分号
float a = pi;
printf("%f\n",a);
#define kPrint printf("hello worle!\n");
kPrint;
// 使用以及定义的宏
#define w 3
#define h 5
#define s w * h
printf("%d\n",s);
*/
// 带参宏定义 计算俩个数相乘的结果
//#define MUL(a,b) a * b
// printf("%d \n",MUL(3,5));
/*
#define MUL(a,b) a * b //没括号 (a) * (b)
#define a 1+2
#define b 3+4
printf("%d\n",MUL(a,b));
*/
/*
1 . 宏定义: 指定一个字符(符号)代表一个字符串
2 . PI: 宏名
3 . 宏定义分类: 有参数,无参数
4 . 宏定义没有 ;
5 . 宏定义只在编译期将所有的指定字符,替换为对应的字符串
6 . 有参数的宏,先替换在计算.名字和参数()之间不能有间隔
7 . 宏不分配内存空间
8 . 宏消耗的是编译期的时间,函数消耗的是运行期的时间
9 . 不能做类型检测
*/
// 条件编译 第一种
/*
#ifdef 标识符
代码段1
#else
代码段2
#endif!
如果 标识符 被#define过 ,编译器编译代码段1,否则编译代码段2
*/
/*
#define INT 10
#ifdef INT
int a = 50;
#else
int a = 100;
#endif
printf("a = %d\n",a);
*/
/*
#ifndef INT
int a = 50;
#else
int a = 100;
#endif
printf("a = %d\n",a);
*/
/*
#if 1
int b = 20;
#else
int b = 30;
#endif
printf("%d\n",b);
*/