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);
*/
   

posted @ 2015-12-26 21:16  _小帅  阅读(163)  评论(0编辑  收藏  举报