高级指针(Day-8)
发布日期:2022-02-08 18:03:20 浏览次数:37 分类:技术文章

本文共 3094 字,大约阅读时间需要 10 分钟。

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.1415926int 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 + bint 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 INTint a = 10;#elseint a = 100;#endif// 第二种编译  如果没定义,执行代码1  否则执行代码2#define PI#ifndef PI//代码1#else//代码2#endif// 第三种编译   如果非0,执行代码1 为0执行代码2#if (2 + 3) //  常量表达式//代码1#else//代码2#endif

转载地址:https://blog.csdn.net/Evelynzn/article/details/48489477 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:指针(Day-7)
下一篇:内存分配(Day-9)

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月21日 10时09分11秒