• 结构体指针的引入


    概念引入

    结构体指针类似于前面学习过的指针,我们先回忆下指针:指针就是地址指针变量就是存放地址的变量。而结构体也是变量,变量访问有两种方式:1.变量名, 2.地址,之前案例,是用变量名访问。通过结构体变量地址来访问该结构体需要一个变量来保持这个地址:这和之前说的指针,其实是一样的,只是指针类型是结构体

    定义方式

    两者的定义方式基本一直,普通变量通过指针访问地址数据,而结构体变量通过结构体指针访问。

    普通指针的定义

    1. int a,
    2. int *p;
    3. p = &a;

    结构体指针的定义

    1. struct Test t;
    2. struct Test *p;
    3. p= &t

    访问方式

    结构体指针访问变量方法有:

    1)p->结构体成员;
    2)(*p).结构体成员;

    1. #include
    2. struct Test
    3. {
    4. int Data1;
    5. char Data2;
    6. };
    7. int main()
    8. {
    9. struct Test data = {10,'a'};//1.类型 2.名 3.值
    10. struct Test *p = &data;//4.地址
    11. printf("通过data结构体访问得到的Data1是%d\n",data.Data1);
    12. printf("通过指针*p结构体访问得到的Data1是%d\n",p->Data1);
    13. printf("通过指针*p结构体访问得到的Data1是%d\n",(*p).Data1);
    14. printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
    15. printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
    16. printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
    17. p->Data2 = 'm';//对指向数据进行修改
    18. printf("通过data结构体访问得到的Data2是%c\n",data.Data2);
    19. printf("通过指针*p结构体访问得到的Data2是%c\n",p->Data2);
    20. printf("通过指针*p结构体访问得到的Data2是%c\n",(*p).Data2);
    21. return 0;
    22. }

    实际应用

    我们用结构体指针对前面的选票系统加以改良

    1. #include
    2. #include
    3. struct XuanMin
    4. {
    5. char name[64];
    6. int tickets;
    7. };
    8. int main()
    9. {
    10. struct XuanMin a[3];//三位选手
    11. struct XuanMin max;//比较三位选手得票最大值
    12. struct XuanMin *p = a;//指向首地址数据
    13. int number = 5;//5个人参与投票
    14. char tempname[64];//投票的名字
    15. int feipiao = 0;//没选中的票
    16. int i;
    17. int j;
    18. int c = 0;//一个判断逻辑
    19. int len = sizeof(a)/sizeof(a[0]);
    20. p = a;//指向首地址
    21. for(i = 0;i < len;i++)
    22. {
    23. p->tickets = 0;
    24. printf("请输入第%d个选民的名字:\n",i+1);
    25. scanf("%s",p->name);
    26. p++;
    27. }
    28. p = a;//指向首地址
    29. for(i = 0;i < 5;i++)
    30. {
    31. c = 0;//每次循环让其等于0
    32. printf("请输入你要投给谁\n");
    33. memset(tempname,'\0',sizeof(tempname));//每次清空一下
    34. scanf("%s",tempname);//输入选中的选民
    35. p = a;//指向首地址
    36. for(j = 0;j < len;j++)
    37. {
    38. if(strcmp(tempname,p->name)==0)//选民与选手匹配,票数递增
    39. {
    40. p->tickets++;
    41. c = 1;//如果匹配后票数增加并等于1
    42. }
    43. p++;
    44. }
    45. if(c == 0)//还是为0说明没有匹配选手,则为没选中的票
    46. {
    47. printf("没有此选手,投票失败\n");
    48. feipiao++;
    49. }
    50. }
    51. p = a;//指向首地址
    52. for(i = 0;i < len;i++)
    53. {
    54. printf("名字:%s,票数:%d\n",p->name,p->tickets);
    55. p++;z
    56. }
    57. p = a;//指向首地址
    58. max=a[0];//让最大值先等于第一个人
    59. for(i = 1;i < len ;i++)//i=1是因为max已经等于数组中第一个人,只需要与后面两个进行比较
    60. {
    61. if(max.tickets < p->tickets)
    62. {
    63. max = a[i];//将三个人票数最多的赋给最大值
    64. }
    65. p++;
    66. }
    67. printf("%s以%d票当选!!!废票是%d\n",max.name,max.tickets,feipiao);
    68. return 0;
    69. }

    注意:1.每次进行新的循环要让指针重新指向首地址

               2.其中包含数组,经过一次循环后要偏移到数组中的下一位

  • 相关阅读:
    Kotlin中使用Java数据类时引发的一个Bug
    基于基于全局差错能量函数的双目图像立体匹配算法matlab仿真,并提取图像的深度信息
    【总结】两个独立同分布的随机变量相加还是原来的分布吗?
    阿里云OSS图床搭建方法
    2023-10-11 python-windows平台-安装-记录
    智能家居2.0 - Matter 1.0 标准和受益者
    「数组」随机快速选择 / LeetCode LCR 076(C++)
    《数据在外设中的存储》
    DBCO-Oleic, CAS:2279951-78-7 DBCO-油酸
    电机控制方案汇总
  • 原文地址:https://blog.csdn.net/2301_78772787/article/details/134092247