C语言基础知识之(十六):结构体和指针

一、定义一个老师类型的结构体,包含老师的姓名和年龄

struct teacher{

    char names[20];

    int age;

};

typedef structteacher Teacher;

Teacher t1 = {“zhangsan”,25};

 

结构体指针:指针指向结构体类型的变量.

定义指针指向结构体,指针p指向结构体的起始地址,即第一个成员变量的起始地址。

Teacher *p =&t1;

 

结构体变量访问:

通过结构体指针访问成员变量

第一种:使用指针取值运算符*

 (*p).names (*p).age

语法:(*指向结构体的指针).成员变量

注意:()不能省略, .的优先级高于*。

修改、打印结构体成员变量:

(*p).age = 28;

printf("%s%d\n", (*p).names, (*p).age);

 

第二种:使用指向箭头 ->,p->age,p->names

语法:指向结构体的指针->成员变量

修改、打印结构体成员变量的姓名:

strcpy(p->names,"qianqi");

printf("%s %d\n",  p->names, p->age);

   

练习:定义两个老师,获取年龄最大的老师,并输出全部信息,使用指针

方法一:指向箭头  

Teacher t1 ={"zhangsan", 28};

Teacher t2 ={"lisi", 24};

 

Teacher *p1 =&t1;

Teacher *p2 =&t2;

 

if (p1->age >p2->age) {

    printf("%s %d\n", p1->names,p1->age);

}else {

    printf("%s %d\n", p2->names,p2->age);

}

方法二:指针取值运算符*  

if ((*p1).age >(*p2).age) {

    printf("%s %d\n", (*p1).names,(*p1).age);

} else {

    printf("%s %d\n", (*p2).names,(*p2).age);

}

 

按要求遍历t1结构体中姓名字符串中的字符:

int length =(int)strlen(p->names);

for (int i = 0; i< length; i++) {

//如果第一个字符是小写字符,替换成对应的大写字符

printf("%c", (p->names)[i]); //下标法,语法糖

printf("%c", *((p->names)+i));//指针法

       

if ((p->names)[i]>= 'a' && (p->names)[i] <= 'z') {

    (p->names)[i] -= 32;//小写字母的值比大写字母的值大32,A的值为65

}

printf("%s\n", p->names);

}

 

二、指针和结构体数组

定义结构体数组:

Student stu1 = {1,"zhangsan", 'f', 95.5};

Student stu2 = {2,"lisi", 'm', 98.5};

Student stu3 = {3,"wangwu", 'm', 96.5};

Student stu4 = {4,"zhaoliu", 'm', 94.5};

Student stu5 = {5,"qianqi", 'f', 97.5};

   

Student stus[5] ={stu1, stu2, stu3, stu4, stu5};

 

遍历结构体数组的全部信息  

for (int i = 0; i< 5; i++) {

     printf("%d %s %c %.2f\n",stus[i].num, stus[i].names, stus[i].sex, stus[i].score);

}

指针和结构体:定义结构体指针指向数组的首元素

Student *p = stus;

for (int i = 0; i< 5; i++) {

     printf("%d %s %c %.2f\n",p[i].num, p[i].names, p[i].sex, p[i].score);//使用的是下标法

}

 

   

二、结构体作为函数的参数

定义一个学生类型的结构体,包含学号,姓名,性别,分数等信息。

struct student {

    int num;

    char names[20];

    char sex;

    float score;

};

typedef structstudent Student;

 

函数1:打印结构体所有的信息,参数是结构体类型的变量

voidprintStructStudent(Student stu);

voidprintStructStudent(Student stu){

    printf("%d %s %c %.2f\n",stu.num, stu.names, stu.sex, stu.score);

}

 

//函数:打印结构体所有的信息,参数是指向结构体类型的指针

voidprintStructStu(Student *s);

void printStructStu(Student*s){

    printf("%d %s %c %.2f\n",s->num, s->names, s->sex, s->score);

}

 

//函数:打印结构体数组中所有的信息

voidprintAllStudent(Student stus[], int count);//非指针方法

voidprintAllStudent(Student *stus, int count);//指针方法

voidprintAllStudent(Student *stus, int count){

    for (int i = 0; i < count; i++) {

        printStructStudent(stus[i]); // 传入结构体

//        printStructStu(stus+i);// 传入结构体地址

    }

   

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值