结构体的房子模型解析

#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; 
}

原文地址:https://www.cnblogs.com/siguoya/p/3464019.html