指向结构体类型数据的指针
一个结构体变量的指针就是这个结构体变量所占据的内存段的起始地址。
用指针变量指向结构体变量,此时这个指针变量的值是结构体变量的起始地址。
指针变量也可以用来指向结构体数组中的元素
结构体指针变量一般形式为:
struct 结构名 *结构指针变量名
如:struct stu *stu1;
当然也可以在定义结构体的同时来说明stu1
结构体结构体指针变量也必须先赋值在使用
赋值是把结构变量的首地址赋予这个指针变量,不能把结构名赋予这个指针的变量
如:
stu1=&boy;(正确)
stu1=stu;(错误)
这个是由于结构名只是一个结构形式系统并不对它分配内存空间,只有变量编译系统才会对他分配内存空间。
访问形式:
(*结构指针变量).成员名
如:(*stu1).num
或者
结构指针变量->成员名
如:stu1->num
例如:
#include<stdio.h>
struct stu{
int num;
char *name;
char sex;
float score;
}stu1={101,"join",'m',99};
void main(){
struct stu *stu2;
stu2=&stu1;
print("number=%d\nname=%s\n",stu1.num,stu1.name);
print("sex=%c\nscore=%f\n\n",stu1.sex,stu1.score);
print("number=%d\nname=%s\n",(*stu2).num,(*stu2).name);
print("sex=%c\nscore=%f\n\n",(*stu2).sex,(*stu2).score);
print("number=%d\nname=%s\n",stu2->num,stu2->name);
print("sex=%c\nscore=%f\n\n",stu2->sex,stu2->score);
}
结构指针变量做函数参数
如果将一个结构体变量的值传递给另一个函数,那么有三种方法:
(1)用结构体变量的成员作参数;
(2)用结构体变量作实参;
(3)用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参
例如:
用结构体变量作函数参数
#include<stdio.h>
#include<string.h>
struct student {
int num;
char name[10];
float score[5];
};
void print(struct student);
void main(){
struct student stu;
stu.num=9;
strcpy(stu.name,"stu");
stu.score[0]=99;
stu.score[1]=88;
stu.score[2]=77;
print(stu);
}
void print(struct student stu){
print("\tnum:%d\n",stu.num);
print("\tname:%s\n",stu.name);
print("\tscore1:%3\n",stu.score[0]);
print("\tscore2:%5\n",stu.score[1]);
print("\tscore3:%7\n",stu.score[2]);
}
改用指向结构变量的指针作实参
#include<stdio.h>
#include<string.h>
struct student {
int num;
char name[10];
float score[5];
};
void print(struct student*);
void main(){
struct student stu;
stu.num=9;
strcpy(stu.name,"stu");
stu.score[0]=99;
stu.score[1]=88;
stu.score[2]=77;
print(&stu);
}
void print(struct student*){
print("\tnum:%d\n",stu.num);
print("\tname:%s\n",stu.name);
print("\tscore1:%3\n",stu.score[0]);
print("\tscore2:%5\n",stu.score[1]);
print("\tscore3:%7\n",stu.score[2]);
}