结构体指针、函数封装、字符串的结合

所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针,如果把一个结构体变量的起始地址存放在一个指针变量中,那么这个指针变量就指向该结构体变量。

struct Student* pstu

就定义了一个结构体指针,和整型的指针变量都差不多,pstu为结构体指针变量,用来存放结构体地址的变量,需要注意的是结构体指针是用“->”运算符来访问结构体中的成员,普通结构体变量访问成员是用“.”来访问。

结构体指针的具体用法如下代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct Student{

    int score;
    char* name;

};

struct Student* initia(int len)
{
    //用malloc为指针变量pstu申请内存空间
    //malloc开辟了空间不会自动释放,将空间赋值后返回首地址就可以
    struct Student* pstu = (struct Student*)malloc(len*sizeof(struct Student));
    int i;

    for(i = 0;i < len;i++){

        printf("请输入第%d个学生的名字\n",i+1);
        pstu->name = (char *)malloc(128);  //为指针name申请空间
        memset(pstu->name,'\0',128);
        scanf("%s",pstu->name);
        printf("请输入第%d个学生的分数\n",i+1);
        scanf("%d",&(pstu->score));
        if(pstu->score > 100 || pstu->score < 0){

            printf("请输入0 - 100以内的数\n");
            system("pause");
            exit(-1);
        }

        pstu++;
    }

    return pstu - len;   //返回开辟的空间的首地址,让指针回到pstu的首地址,
}

void printinit(struct Student* p,int len)
{
    int i;
    for(i = 0;i < len;i++){

        printf("第%d个学生名字叫%s成绩为%d\n",i+1,p->name,p->score);

        p++;
    }

}

struct Student* printMax(struct Student* p,int len )
{
    int i;
    struct Student* Max = p;    //让Max指向p,和P指向同一地址
    for(i = 0;i < len;i++){

        if(Max->score < p->score){

            Max = p;
        
        }
        p++;  //偏移一个结构体的大小
    }
    return Max;
}

struct Student* printMin(struct Student* p,int len)
{
    int i;
    struct Student* Min = p;        //让Min指向p,和p指向同一地址
    for(i = 0;i < len;i++){

        if(Min->score > Min->score){

            Min = p; //交换两个人
        }
        p++;
    }

    return Min;
}

float printAverage(struct Student* p,int len)
{
    int i;
    int sum = 0;
    for(i = 0;i < len;i++){

        sum = sum + p->score;
        p++;
    }
    return (float)sum/len;
}

int findSomeonename(struct Student* p,int len,char* name)
{
    int i;
    for(i = 0;i < len;i++){

        if(strcmp(name,p->name) == 0){

            return 1;
        }
    }

    return -1;
}

int main()
{
    int len;
    printf("请输入总人数\n");
    scanf("%d",&len);
    struct Student* pstu = NULL;  //初始化结构体指针为NULL,防止野指针
    struct Student* Max = NULL;
    struct Student* Min = NULL;

    pstu = initia(len);   //初始化

    printinit(pstu,len);  //打印

    Max = printMax(pstu,len);  //找最大值

    Min = printMin(pstu,len);  //找最小值

    float Average = printAverage(pstu,len); //计算平均分

    printf("考最高分的是%s,分数为%d\n",Max->name,Max->score);

    printf("考最低分的是%s,分数为%d\n",Min->name,Min->score);

    printf("平均分等于%f\n",Average);

    int name = findSomeonename(pstu,len,"张三");  //找输入的人里面有没有张三这个人

    if(name == 1){

        printf("找到了\n");
    }else{

        printf("没有找到张三\n");
    }

    system("pause");
    return 0;
}
 

这是一个非常简单的找最大值,最小值,计算平均值的程序,里面包含了结构体指针的定义与用法、结构体指针和函数的结合以及和字符串的结合,这里需要注意的是使用结构体指针的时候不要忘了为指针申请空间,struct Student* pstu = (struct Student*)malloc(len*sizeof(struct Student)),表示定义了一个结构体指针变量pstu,并且给pstu申请了内存空间,如果没有给指针申请内存空间就会出现段错误,导致程序崩溃,还需要注意的是在初始化里面返回结构体指针的时候要注意指针已经偏移到申请的内存空间外面了,所以返回时指针要往回偏移。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值