一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设置一个指针变量用它指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素,从而能够通过结构体指针快速访问结构体内的每个成员。
//typedef
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
struct student {
int num;
char name[20];
char sex;
};
int main(void)
{
struct student s = { 1001,"wangle",'M' };
struct student sarr[3] = { 1001,"lile",'M',1005,"zhangsan",'M',1007,"lili",'F' }; //结构体数组
struct student* p; //结构体指针变量
p = &s;
printf("%d %s %c\n", (*p).num, (*p).name, (*p).sex); //(*p)变为整体等价为s
//等价于以下
printf("%d %s %c\n", p->num, p->name, p->sex); //通过结构体指针访问成员
p = sarr; //等价于p=&sarr[0],取结构体数组中第一个元素
printf("------------------------------\n");
p = p + 1; //指针偏移到结构体数组的第二个元素
printf("%d %s %c\n", p->num, p->name, p->sex);
return 0;
}
????????前面定义结构体变量时使用的语句是 struct student s,以这种方式来定义结构体变量有些麻烦,即每次都需要写 struct student。简单一些的定义方式可以选择使用 typedef 声明新的类型名来代替已有的类型名。
//typedef
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct student { //tupedef重命名结构体
int num;
char name[20];
char sex;
}stu, * pstu; //struct student重命名为stu,pstu等价于struct student*
typedef int INGETER; //可用于变量类型更改
int main()
{
stu s = { 0 }; //数组中的变量都是零
stu* p = &s; //定义了一个结构体指针变量
pstu p1 = &s;
INGETER num = 10; //局部变量名可以用与结构体中成员的名字相同
printf("num=%d,p->num=%d\n", num, p->num);
return 0;
}