关于结构体,共同体,以及链表等内容的一些分析题。
初学结构体与链表这章,通过一些浅显的预习,稍微做了试验任务中的三道题,这里做一下笔记。
1.可以通过(*p).成员名 引用p指向的变量的成员。
2.用指向指针结构体变量的指针引用结构体变量的成员。格式:指向结构体变量的指针->成员名。
3.可以通过p->成员名,直接访问成员
4."."和"->"的优先级相同,都位于最高优先级
5.共同体的内存是其占用内存最大的成员的内存,结构体的内存是每一个成员所占用的内存之和。
以后再补充
这里把题目和自己的分析记录以下,以便后续复习。
1.分析代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct data{ int n; float score; }; void main(){ struct data a[3]={1001,87,1002,72,1003,90},*p=a; printf("%d\n",(p++)->n); printf("%d\n",(p++)->n); printf("%d\n",p->n++); printf("%d\n",(*p).n++); }
分析:
主函数之前定义一个名为data的结构体数组,其成员分别为n和score.在主函数中,向结构体中的成员赋值,n的值分别是1001,1002,1003.score的值分别为87,72,90.p为指针变量,定义时指向a的首地址.第一个printf语句,p++的值为p+1之前的数值,也就是仍然指向a的首地址,也就是a[1]中所对应的n值,即1001;第二个printf语句,p的值已经加1,输出的是a[2]中所对应的值,也就是1002;第三个printf语句,p的值为相对于第二个printf语句已经加1,此时p->n对应的是a[3]中的n值,也就是1003,p->n++的数值是p->n这个数值自加之前的数值,依旧是1003.第四个printf语句和第三个同理,输出结果为1004。
因此输出结果为1001,1002,1003,1004.
2.分析代码
#include <stdio.h> #include <stdlib.h> #include <string.h> struct node{ char *s; struct node *q; }; int main() { struct node a[]={{"clinton",a+1},{"bush",a+2},{"obama",a}}; struct node *p=a; printf("%s\n",p->s); printf("%s\n",p->q->s); printf("%s\n",p->q->q->s); return 0; }
分析:
主函数之前定义了一个名为Node的结构体数组,其成员包括字符型指针s已经指向结构体Node的指针q.主函数第一句对node赋值。第一个printf语句中p指向a[0]中的成员s,也就是clinton.第二个printf语句中,p指向a[0]中的q,也就是指向a+1即a[1],接着再指向s即对应的是a[1]中的s的字符也就是bush.第三个printf语句中p指向q,也就是指向a[1],q又指向了q,也就是指向了a[1]中的q即a+2,然后又指向了s也就是指向了a[2]中s的字符也就是obama.因此最后的输出结果为 Clinton,bush, Obama.
3.分析代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ typedef union {long i;int k[5];char c;}DATE; struct data {int cat; DATE cow; double dog;}; printf("%d\n",sizeof(struct data)); }
分析:
将一个共同体函数定义为类型DATE,分析这个共同体函数,long i;占八个字节,Int k[5],占5X4也就是20个字节, char c,占一个字节,这个共同体类型所占内存就是其最大成员所占的字节,也就是20.
对于下面的结构体分析,结构体的内存是每一个成员所占内存的.int cat,4个字节,DATE cow 类型为DATE,占据20个字节.double dog 8个字节,因此总共占据4+20+8=32个字节,故输出结果为32.
语言稚嫩,理解肤浅,望见谅。