#include<stdio.h>
struct Node{
char a; //0
short b;//2,3
char c;//4,
int d;//8,9,10,11
} name;
int main()
{
char Array[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
struct Node *p = (struct Node*)(void*)Array;
printf("%#x, %#x, %#x, %#x", (int)(p->a), (int)(p->b), (int)(p->c), (int)(p->a));
return 0;
}
解析:1房子模型 : 结构体就像一个房子模型,一个结构体的变量(name)就相当于这个房子模型的名字,结构体指针就像这个房子模型的地址,如果想要使用这个房子模型(结构体)就必须通过房子模型的名字或者地址。
2 盖房子: 结构体里面的成员就是这个房子里面的房间,这个房子模型有a , b, c, d四个有名字房间,每个房间都有其大小,大小为这个结构体成员所分配的内存空间(a为1,b为2,c为1,d为 4),但是这个房子模型总大小为12,所以房子里面还有其他没有给出名字的房间。由于数组Array占有一段内存空间,struct Node *p = (struct Node*)(void*)Array;,所以这句就是通过房子的地址(结构体指针)来使用这个房子模型在Array上面盖这个房子,所盖房子的大小以及里面的结构都已确定,只需要在Array这块内存空间上按结构体成员的顺序分配就行,例如 房间 a分配的为Array[0], 房间b分配的为Array[2] ,Array[3],房间c分配的为Array[4], 房间d分配的为Array[8] ,Array[9] ,Array[10] ,Array[11],而Array[1] ,Array[5],Array[6], Array[7]也在房子内,只是所在的房间名字不知道,像Array[12],Array[13]一直到后面Array[19]都不在这个房子里面了。房间a里面的东西就是Array[0]的值1,房间b里面的东西就是Array[2],Array[3]的值3,4 以此类推c,d。。。
3 取房间里的东西: printf("%#x, %#x, %#x, %#x", (int)(p->a), (int)(p->b), (int)(p->c), (int)(p->a));这一句就是房子已经在Array上面盖好,要把房间a ,b, c,d里面的东西取出来而已。。。。。。
例子解析:
#include <stdio.h>
struct node{
char a;//0
int b;//4,5,6,7
char c;//8
//还有9,10,11 此房子模型占面积12
};
struct node1{
char a;//0
char b;//1
int c;//4,5,6,7 此房子模型占面积8
};
struct node NODE = {3,4,5};//把3,4,5装在NODE这个房子里有名字的房间a,b,c(此房子就是一块内存,后面还可以在这块内存上根据node1房子模型再盖一个房子)
int main()
{
struct node1 *p = (struct node1 *)&NODE; //通过node1这房子模型的地址*p使用这个模型在NODE这块内存空间(一个房子的空间)上盖房子
printf("%#x ", p->a);
printf("%#x ", p->b);
printf("%#x ", p->c);
return 0;
}
例子
#include <stdio.h>
struct SC{int a,b,c;};
struct SD{int a,b,c,d;};
int main()
{
struct SC c1[] = {{3}, (4),{5}, {6}}; //结构体数组---数组里面都是结构体(盖了四个struct SC模型的房子)
printf("%d ,%d, %d
",c1->a, c1->b,c1->c);
struct SD *c2 = (struct SD*)c1 + 1;
printf("%d,%d,%d,%d
",c2->a,c2->b,c2->c,c2->d); // 0 0 5 0
return 0;
}