您的位置:首页 > 编程语言 > C语言/C++

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

2015-08-31 21:19 691 查看
一、定义一个老师类型的结构体,包含老师的姓名和年龄
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);// 传入结构体地址
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: