高级指针(Day-8)

1. 结构体指针

1—

int main() {
    typedef struct teacher{
        int number;
        int age;
    }Teacher;
    Teacher tea1 = {1,28};
    Teacher *p = &tea1;
    printf("%d %d", tea1.age, (*p).number);
    return 0;
}

直接访问:tea1.number

间接访问:
(1) (*p).number // 因为”.”的优先级高于星号,所以需要用括号将前面的指针包起来,不能省略括号
(2)p->age // ->(箭头):一个减号,一个大于号 (最常用

int main() {
    typedef struct teacher{
        int number;
        int age;
        char *name;
    }Teacher;
    // 结构体指针:指向结构体变量的指针
    Teacher tea1 = {1,28};
    Teacher *p = &tea1; 
    p->number = 6;
    printf("%d %d", p->number, (*p).number);

    //   结构体数组指针:
    Teacher tea[] = {{1, 34, "zhang"}, {2, 45, "wang"}};
    Teacher *p = tea;
    if (p[0].age > p[1].age) {
        printf("%d  %d  %s\n", p->age, p->number, p->name);
    }
    else  //  两种间接访问实现
        printf("%d  %d  %s\n", (p + 1)->age, (*(p + 1)).number, (*(p + 1)).name);
    return 0;
}

结构体数组的数组名是一个结构体指针常量

2—例题:Student stu = {1, “lan ou”, ‘m’, 95.6};将name第一个字母大写,name中所有的空格换成下划线,利用结构体指针实现。

typedef struct student{
    int num;
    char name[10];
    char gender;
    float score;
}Student;
int main() {
    {
        Student stu = {1,  "lan ou", 'm', 95.6};
        Student *p = &stu;
        *(p->name) -= 32;
        for (int i = 0; i < (int)strlen(p->name); i++) {
            if ((*(p->name + i)) == ' ') {
                *(p->name + i) = '_';
            }
        }
        printf("%s\n", p->name);
    return 0;
}
// 结果:Lan_ou

3—结构体数组与指针

typedef struct ranking{
    int num;
    char name[10];
    int score;
}Ranking;
int main() {
        Ranking rank[3] = {
            {1, "Jay", 5000},
            {2, "Jack", 2000},
            {3, "Joe", 1000}
        };
        Ranking *p = rank;
//       printf("%d, %s, %d", p[0].num, p[0].name, p[0].score);  // 单个元素输出
//       printf("%d, %s, %d", p[1].num, p[1].name, p[1].score);
//       printf("%d, %s, %d", p[2].num, p[2].name, p[2].score);
        for (int i= 0; i < 2; i++) {
            for (int j = 0; j < j - i; j++) {
                if (p[j].score < p[j + 1].score) {
                    Ranking temp = p[j];
                    p[j] = p[j + 1];
                    p[j + 1] = temp;
                }
            }
        }
        for (int i = 0; i < 3; i ++) {
            printf("%d, %s, %d\n", p[i].num, p[i].name, p[i].score);
        }
    return 0;
}

2. 预编译指令

1—普通宏 :
关键字(#define) 宏名(全大写 或者 k+驼峰) 值
例如:MAX kMax
关键字(#undef 结束处) 宏名(定义的宏名)

#define PI 3.1415926
int main() {
     int a [5] = {12, 34, 12, 11, 89};
     for (int i = 0; i < COUNT; i++) {
          printf("%d", a[i]);
    }
#pragma mark---------------预编译指令
    double b = PI;
    printf("%f\n", b);
    //  宏定义结束
#undef PI  

2—带参数的宏

#define SUM(a, b) a + b
int main(){
    int a = SUM(2, 3);
    printf("%d\n", a);
    int c = SUM(2, 3) * SUM(4, 6);
    //  结果:20  2 + 3 * 4 + 6 = 20   想让它等于50  加个括号就可以啦
}

所以在宏定义时,就最好加上括号

#define SUM(a, b) (a + b)  //  避免出现扯淡的错误,防止受操作符优先级的影响

3—条件编译

// 第一种编译 如果定义了,执行a=10 否则执行a=100
#define INT

#ifdef INT
int a = 10;
#else
int a = 100;
#endif

// 第二种编译  如果没定义,执行代码1  否则执行代码2
#define PI
#ifndef PI
//代码1
#else
//代码2
#endif

// 第三种编译   如果非0,执行代码1 为0执行代码2
#if (2 + 3) //  常量表达式
//代码1
#else
//代码2
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值