#include <stdio.h>
#include <stdlib.h>
/*结构体变量的值是整个结构体。结构体变量名就是变量名。
象int a一样,只是printf 处理不了结构体。通过 printf
输出结构体,结果是没有意义的(整个结构体复制堆栈中,按
照对应的格式输出)。取地址要用&,不用钻牛角尖,不直接
输出就行了*/
typedef struct {
short d;
short e;
}DATA2;
typedef struct {
int a;
short b;
DATA2 c;
char f;
}DATA1;
void test01() {
DATA1 stu = {0};
printf("长度=%d\n", sizeof(stu));
printf("a的地址%p\n", &stu.a);
printf("b的地址%p\n", &stu.b);
printf("d的地址%p\n", &stu.c.d);
printf("e的地址%p\n", &stu.c.e);
printf("f的地址%p\n", &stu.f);
}
/*结果
a a a a
b b d d
e f
*/
void test02() {
DATA2 stu = { 20,'a' };
char *p = &stu;
printf("d的值是%c\n", *(short*)(p + 2));
//(short*)p->c是错的,一个char型指针不能指向结构体成员
}
void test03() {
DATA2 li = { 16, 5 };
printf("%8x\n", li);
//printf("%x\n", *li);是错的, * 操作的只能是指针
printf("%p\n", &li);
printf("%8x\n", *(int *)&li);
}
结构体作为一种自定义数据类型,结构类似于数组,但是结构体名 与数组名有很大的区别:
数组名是作为内存中固定不可修改的地址常 量而存在,不可以直接赋值。
而结构体相当于int,double之类的系统内定类型,代表了一段内存空间的内容。是可以整体赋值的,结构体中的数组,在结构体赋值的过程中,也是可以针对每个元素一一赋值的。
test03()运行结果: