`
v5qqcom
  • 浏览: 1289428 次
文章分类
社区版块
存档分类
最新评论

C语言结构体部分--知识点及试题

 
阅读更多
  结构体是一种重要的数据结构,在实践中有广泛的应用。计算机二级考试大纲对结构体部分的要求为:(1)结构体类型数据的定义方法和引用方法。(2)用指针和结构体构成链表,单向链表的建立、输出、删除与插入。下面就这些基本知识点和有关试题进行总结和解析,希望对考试有所帮助。
  一、基础知识
  (1) 结构体的定义
   struct 结构体名 例如: struct student
   { {
   成员列表 char name[20];
   }变量表; int age;
  char sex;
   }stu1,stu2 ;
  注意:结构体定义完后,别忘了分号!
   也可这样定义:struct student stu1, stu2 ;
   结构体数组的定义: struct student x[10];
  (2) 结构体成员的访问
  两种方式 : 直接访问。如:stu1. age
   用指针访问。先定义指向结构体的指针:struct student *p;
   然后可以通过:(*p) . 成员变量 或 p->成员变量 来访问。
  (3) 关于单项链表
  先了解两个函数:
  内存分配函数 malloc
  如:int *p; p=(int *) malloc (sizeof (int));分配一块整型大小的内存空间。
  注意:malloc无返回值,分配内存时要强制类型转换。
  内存释放函数 free
  free ( 要释放内存的地址) ;
  有关链表具体的操作请参看谭浩强的《C程序设计(第二版)》11.7节(p273)
  重点了解基本思想和相关算法,其实考试时的程序根本没有书上的难。在这里我要说,重点理解有关链表插入及删除时指针移动的先后顺序问题。注意指针的保存和归位。(既头指针的保存和链表遍历时指针的归位)。这都是考试重点,相信我没错的。
  二、典型试题及解析
  (1) 以下程序运行的结果是_______
  #include”stdio.h”
  main()
  { struct date
   { int year , month , day ;
   } today ;
  printf(“%d/n”,sizeof(struct date));
  }
  A .6 B.8 C.10 D.12
  解析:本题考察了不同变量在内存中所占字节的位数。现总结如下(针对TC2.0版本):char型变量占1个字节;int型变量占2个字节;long和float型变量占4个字节;double型变量占8个字节。
  本题定义了3个int型变量,所以选A.
  这类计算占字节大小的题,通常和联合体结合起来考。请看下例:
  变量a所占内存字节数是_______
  union U
  { char st[4];
   int I ;
  long l ;
  } ;
  struct A
  { int c;
   union U u ;
  } a ;
  答案应该是6 。注意:联合体分配内存时是按照所占内存最多的一类变量的数目分配的。而不是所有变量所占内存数量的和。
  特别注意:实际编程中,在没有定义结构体类型变量之前,系统是不会给结构体的成员变量分配内存的。
  (2) 以下程序输出结果是_______
   struct stu
   { int x ;
   int *y;
   } *p ;
  int dt[4]={ 10 , 20 , 30 , 40 };
  struct stu a[4]={50 , &dt[0] , 60 , &dt[1] , 70 , &dt[2] , 80 , &dt[3] } ;
  main()
  { p=a;
   printf(“%d,” , ++p->x); //语句1
   printf(“%d,” , (++p)->x ); //语句2
  printf(“%d/n” , ++(*p->y) ); //语句3
  }
  A.10 , 20 , 20 B.50 , 60 , 21 C.51 , 60 , 21 D 60 , 70 , 31
  解析:这类题考察了结构体成员变量的访问以及运算符的优先级。需要注意的是“à”的优先级大于“++”和“* ”的优先级。
  语句1中,先执行p->x ,得到50后再++ , 得到结果51。
  语句2中,先执行(++P) ,指针移动后,取得成员变量x的值为60。
  语句3中,先取得*p->y的值,即dt[1]的值,然后++ ,最后得21。
  引申一下:将语句一改为 printf(“%d” , p++ ->x); 则结果变为:_______
  答案是50 ,70 ,31 。好好想一下吧。下面有几道这类练习题,可以强化一下。
  1. 设有以下语句:
  struct st
  { int n ;
  struct st *next;
  } ;
  static struct st a[3]={ 5 , &a[1] , 7 , &a[2] , 9 ,’/0’} , *p ;
  p=&a[0];
  则以下表达式的值为6的是________
  A. p++ ->n B. p->n++ C. (*p) . n++ D. ++p ->n
  2. 设有以下语句,则下面表达式中的值为3的是_______
   struct s
   { int a1 ;
   struct s *a2 ;
   } ;
   static struct s a[3]={1 , &a[1] , 2 , &a[2] , 3 ,&a[0] } , * ptr ;
   ptr=&a[1] ;
  A. ptr -> a1++ B. ptr++ ->a1 C. *ptr -> a1 D. ++ptr ->a1
  3. 若有以下语句,则下面表达式的值为1002的是______
   struct student
   { int age ;
   int num ;
   } ;
  struct student stu[3]={{1001,20} , {1002,19} , {1003,21}} ;
  struct student *p ;
  p=stu ;
  A. (p++) -> num B. (p++)->age C. (*p) . num D. (*++) . age
  4. 若有以下说明和语句:
   struct student
   { int age ;
   int num ;
   } std , *p ;
   p=&std ;
   则以下对结构体变量std 中成员age 的引用方式不正确的是_______
  A. std . age B. p -> age C. (*p) . age D. *p . age
  以上4题的答案均为 D 。
  (3) 若已建立下面的链表结构,指针p ,q分别指向图中所示结点,则不能将q所指的结点插入到链表末尾的一组语句是_________
  A. q->next=NULL ; p=p->next ; p->next=q ;
  B. p=p->next ; q-> next=p->next ; p->next=q ;
  C. p=p->next ; q->next=p ; p->next=q ;
  D. p=(*p) . next ; (*q) . next=(*p) . next ; (*p) . next=q;
  解析:本题就是前面提到的链表的插入及删除类问题。重点理解结点的链入和删除顺序。
  既指针移动的先后顺序。做这种处理时要慎重,谨防结点丢失。本题答案是C 。
  (4)下面程序实现的功能是在已定义的的考生链表中删除指定考生号的结点。请按照程序功能填空。
  Struct student *delete ( head , num ) ;
  Struct student *head ;
  Long num ;
  { struct student *p1 , *p2;
   if ( head==NULL )
   { printf (“/nlist NULL ! /n”) ;
   goto end ;
   }
   p2=head ;
   while ((num != p2 -> num )&&( _________[1]_________ ) )
   { p1=p2 ; p2= p2 ->next ; }
   if ( num== p2 ->num )
   {
   if ( p2==head ) head=p2 ->next ;
   else ________[2]___________ ;
   printf (“delete : % ld/n” , num );
   n=n – 1;
   }
   else printf ( “%ld not found ! /n “ , num ) ;
  end :
   return (head );
  }
  解析:链表的删除操作过程一般如下 :
  1. 首先判断要删除结点的链表是否为空,若为空(head==NULL),则输出空表信息。
  2. 设置两个指针变量p1和p2 , 使p2指向头指针head 。
  3. 如果删除的结点是链表中的第一个结点时,则应将p ->next赋值给 head 。
  4. 如果要删除的不是第一个结点,则使p2指向下一个结点。操作时,先将p2赋值给p1, 再将p ->next赋值给p2。这样依次使p1 , p2后移并进行比较,直到找到要删除的结点为止。
  5. 找到要删除的结点时,则要完成删除结点的操作,此时将p2 ->next 赋值给p ->next即可。
  答案:[1] p2 -> next != NULL [2] p1 -> next = p2 -> next
  关于链表还有插入操作,输入和输出,请自己总结。
  链表部分主要理解操作过程思想,考试时,出的题不是很多,但有一定难度。可以说二级考试的最高难度就是链表和指针的混合应用了。所以指针部分也要相当清楚才行。总之,要考高分,这两部分一定要拿下!
  其实,这一章全称叫做“结构体与共用体”。但共用体部分出题不多(一般一两道),主要考内存分配问题,而且经常与结构体混合考察。所以一定要记住共用体的特点,这样应付考试就容易多了。
  在最后,请看一道专门考”共用体”的题目:
  已知下列共用体定义:
  union u_type
  {
   int I ;
   char ch ;
  } temp ;
  现在执行“temp . I=266 ”, temp . ch 的值为 ()
  A. 266 B. 256 C. 10 D. 1
  我认为,这道题可以说是共用体部分最难的考题了。能做出来当然好,一下子做不出来也没关系。(说实话,我第一次也没做出来。^_^ )哦,对了,答案是 C 。
分享到:
评论

相关推荐

    c语言结构体变量课件

    结构体数据类型 1.教学目标 ...因此,在教学过程中直接引入课题,顺序讲解各知识点。 3.教学方法:板书讲解。 4.教学过程设计 (1)问题引入 师口述:在前面的C语言学习过程中我们已经学习了哪些数据类型?

    结构体知识点强化

    结构体知识点强化

    C语言结构体

    C语言的结构体,对于初学者来说,结构体不是很好理解的内容,其中的知识点是我自己摘取的

    C语言-ATM-程序设计.doc

    C语言程序设计 专题实习 实 习 报 告 学校: 系别: 姓名: 班级: 实习时间: 实习目的 1、通过这次专题实习,可以巩固和加深对所学相关知识点的理解。 2、进一步熟悉基本的流程控制结构---实现分支的 if …else ...

    C语言课件-赵岩

    曾哈工大老师赵岩讲C语言课程的课件, 赵岩老师著有《C语言点滴》, 风趣幽默, 适合入门同学学习! Area.zip C语言总复习.pptx C语言推荐书籍.ppt 第0讲-概述.pdf 第10讲-指针的复杂形式.pdf 第11讲-结构体.pdf 第12讲-...

    利用串口传输结构体数据

    C语言结构体大小及对齐问题 字节序(Endianness):大端和小端 二、应用 结构体是一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,即 buffer = {x, x, ...

    猜数字游戏(C语言)(结构体数组)

    4.里面涉及控制台、随机函数偏僻知识点,对学习很有帮助 5.可以自己设置猜的位数、次数 6.代码有注释,易于理解 7.我还有其他资源,自己写的,欢迎私聊询问 8.若代码有什么问题,欢迎私聊一起解决

    C语言进阶-牟海军.pdf

    第10章对C语言中的若干容易让开发者误解误用的陷阱知识点进行了剖析;第11章则对所有程序员必须掌握的几种算法进行了详细的讲解;附录经验性地总结了如何养成良好的编码习惯,这对所有开发者都尤为重要。 本书主要...

    c语言知识点总结

    六、 C语言的语句 七、 C程序的基本结构 八、 选择结构语句  if(表达式) 语句1 else 语句2  条件运算符 表达式1? 表达式2 : 表达式3  switch语句 九、 循环结构  for循环语句  while循环语句 do ...

    2024新版c语言基础知识点,全新内容c语言基础知识点

    本文为你提供了2024年最全面的C语言面试题集锦,覆盖了从基础到高级的各类C语言知识点。内容涉及C语言的基本结构、数据类型、变量和常量、运算符、控制语句、函数、数组、指针、结构体和联合体等基础概念,以及动态...

    C语言知识点总结完美版

    这份资源是关于C语言的全面知识点总结,涵盖了C语言编程的核心概念和技术要点,包括但不限于程序的基本结构(顺序、选择、循环)、数据存储方式(二进制表示和内存地址)、预处理指令、标识符的命名规则和分类、进制...

    个人C语言知识点笔记总结-pdf版

    这份笔记涵盖了C语言的基础语法、数据类型、运算符、条件语句、循环语句、函数、指针、数组、结构体、文件处理等方面的内容。我相信,如果你认真阅读这份笔记,再结合自己一定的相关练习,差不多能够掌握C语言的基础...

    个人C语言知识点笔记总结-md版

    这份笔记涵盖了C语言的基础语法、数据类型、运算符、条件语句、循环语句、函数、指针、数组、结构体、文件处理等方面的内容。我相信,如果你认真阅读这份笔记,再结合自己一定的相关练习,差不多能够掌握C语言的基础...

    个人C语言知识点笔记总结-word版

    这份笔记涵盖了C语言的基础语法、数据类型、运算符、条件语句、循环语句、函数、指针、数组、结构体、文件处理等方面的内容。我相信,如果你认真阅读这份笔记,再结合自己一定的相关练习,差不多能够掌握C语言的基础...

    计算机二级C语言知识点复习资料,精简版

    计算机二级c语言资料**计算机二级C语言知识点复习资料:考试者的必备指南** **内容概要:** 本文为计算机二级C语言考试者提供了全面的知识点复习资料,旨在帮助他们顺利通过考试。内容涵盖了程序设计基础、控制结构...

    C语言重要知识点梳理

    c)在堆空间中申请一个结构体对象:(SStud st={1008, ”aaa”, 98};) SStud* p=(SStud*)malloc(sizeof(SStud)); d)在堆空间中申请一个结构体数组:(SStud st[10]={1008, ”aaa”, 98};) SStud* p=(SStud*)malloc...

    C语言中结构体struct编写的一些要点解析

    主要介绍了C语言中结构体struct编写的一些要点解析,谈到了结构体的声明和指针指向等重要知识点,需要的朋友可以参考下

    个人C语言知识点笔记总结-语雀文档版

    这份笔记涵盖了C语言的基础语法、数据类型、运算符、条件语句、循环语句、函数、指针、数组、结构体、文件处理等方面的内容。我相信,如果你认真阅读这份笔记,再结合自己一定的相关练习,差不多能够掌握C语言的基础...

    C语言中结构体的慨念和使用方法

     简单的来说,结构体是个能包含不同数据类型的一个结构,他是一种能自己定义的数据类型,他的特点和数组主要有两点不同,首先结构体能在一个结构中声明不同的数据类型,第二相同结构的结构体变量是能相互赋值的,...

    C语言入门实战项目-学生成绩管理系统

    内容概要: 一个C语言的入门实战项目,简易学生成绩管理系统。分为学生用户和管理员用户分别登录;学生端可查看自身成绩,实现成绩简易...所包含知识点: malloc动态内存申请、结构体、函数、指针、文件读写 使用场景

Global site tag (gtag.js) - Google Analytics