所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针,如果把一个结构体变量的起始地址存放在一个指针变量中,那么这个指针变量就指向该结构体变量。
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申请了内存空间,如果没有给指针申请内存空间就会出现段错误,导致程序崩溃,还需要注意的是在初始化里面返回结构体指针的时候要注意指针已经偏移到申请的内存空间外面了,所以返回时指针要往回偏移。