众所周知,typedef
是用来为复杂的声明定义简单的别名。最近在学习结构体的时候,被几个点搞得有点迷糊了。
譬如下面几个:
typedef struct stu
{
int a;
} STU, STUARR[10], *PSTU;
第一个STU
没什么好说的,使用STU
来作为struct stu
的别名,正常使用即可。
STU st1;
st1.a = 1;
printf("%d\n", st1.a);
运行结果是st1.a = 1
第二个STUARR[10]
就有点迷糊了,是把STUARR[10]
作为struct stu
的别名吗?像这样:
STUARR[10] st2;
好像问题不大,而当你运行的时候就会出现错误:
实际上STUARR
才是别名,但不是普通的别名,而是结构体数组的别名。使用方法如下:
STUARR st2_arr;
for (int i = 0; i < 10; i++)
{
st2_arr[i].a = i;
printf("%d ", st2_arr[i].a);
}
使用STUARR
声明,那么st2_arr
就是一个装着10个struct stu
类型结构体的数组,我们试着将它初始化并打印出来,结果如下:
实际上[10]STUARR
,把[10]
放到前面和前面的结构体挨在一起会更容易理解一些,但是编译器不认识这种语法。
同理*STUP
其实就是为结构体指针定义一个别名STUP
,使用STUP
声明的变量都为结构体指针
例如:
PSTU st3_pointer;
st3_pointer = &st1;
st1.a = 1;
printf("修改前st1.a = %d\n", st1.a);
st3_pointer->a = 2;
printf("修改后st1.a = %d\n", st1.a);
这里声明一个结构体指针st3_pointer
,指向st1
结构体,初始化st1.a
的值,然后通过st3_pointer
指针修改它的值。运行结果如下: