C笔记--结构

本文详细介绍了C语言中的结构体,包括如何声明、初始化和使用结构体,以及结构体在函数中的应用。同时,还探讨了共用体这种特殊的数据类型,说明了共用体如何在同一内存位置存储不同数据类型,并展示了如何访问共用体成员。通过实例,阐述了结构体和共用体在实际编程中的运用。
摘要由CSDN通过智能技术生成

          这一节学习C语言里面结构,结构是一个或多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组织在一个名字之下。由于结构将一组相关的变量看作一个单元而不是各自独立的实体,因此结构有助于组织复杂的数据,特别是在大型的程序中。 

   结构的基本知识
   首先来建立一些适用于图形领域的结构。点是最基本的对象,假定用x与y坐标表示它,且x、y的坐标值都为整数我们可以采用结构存放这两个坐标,其声明如下:

struct point {
int x;
int y;
};

关键字struct引入结构声明。结构声明由包含在花括号内的一系列声明组成。关键字struct后面的名字是可选的,称为结构标记(这里是point)。结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明,可以用它作为该声明的简写形式。struct声明定义了一种数据类型。在标志结构成员表结束的右花括号之后可以跟一个变量表,这与其它基本类型的变量声明是相同的。例如:struct { ... } x, y, z;从语法角度来说,这种方式的声明与声明 int x,y,z;具有类似的意义。这两个声明都将x、y与z声明为指定类型的变量,并且为它们分配存储空间。如果结构声明的后面不带变量表,则不需要为它分配存储空间,它仅仅描述了一个结构的模板或轮廓。但是,如果结构声明中带有标记,那么在以后定义结构实例时便可以使用该标记定义。例如,对于上面给出的结构声明point,语句struct point pt;定义了一个structpoint类型的变量pt。结构的初始化可以在定义的后面使用初值表进行。初值表中同每个成员对应的初值必须是常量表达式,例如:

struct point maxpt = {320, 200};

自动结构也可以通过赋值初始化,还可以通过调用返回相应类型结构的函数进行初始化。在表达式中,可以通过下列形式引用某个特定结构中的成员:结构名.成员

其中的结构成员运算符“.”将结构名与成员名连接起来。例如,可用下列语句打印点pt的坐标:

printf("%d,%d ",pt.x,pt . y ");

结构与函数

        结构的合法操作只有几种:作为一个整体复制和赋值,通过&运算符取地址,访问其成员。其中,复制和赋值包括向函数传递参数以及从函数返回值。结构之间不可以进行比较。可以用一个常量成员值列表初始化结构,自动结构也可以通过赋值进行初始化。来看一下函数makepoint,它带有两个整型参数,并返回一个point类型的结构:

/* makepoint: make a point from x and y components */
struct point makepoint (int x, int y)
{
struct point temp;
temp.x = x;
temp.y =y;
return temp;
}

注意,参数名和结构成员同名不会引起冲突。事实上,使用重名可以强调两者之间的关系。 现在可以使用makepoint函数动态地初始化任意结构,也可以向函数提供结构类型的参数。如下:

struct rect screen;
struct point middle;
struct point makepoint(int, int);
screen.pt1 = makepoint(0,0);
screen.pt2 = makepoint (XMAX, YMAX);
middle = makepoint((screen.pt1.x + screen.pt2.x)/2,
(screen.ptl.y + screen.pt2.y)/2);

接下来需要编写一系列的函数对点执行算术运算。例如:

/* addpoints: add two points */
struct addpoint (struct point pl, struct point p2)
{
p1.x +=p2.x;
p1.y +=p2.y;
return p1;
}

其中,函数的参数和返回值都是结构类型。之所以直接将相加所得的结果赋值给p1,而没有使用显式的临时变量存储,是为了强调结构类型的参数和其它类型的参数一样,都是通过值传递的。

注意:结构指针的使用频度高,为了使用方便,C语言提供了另一种简写方式。假定p是一个指向结构的指针,可以用 p->结构成员,看个栗子:

#include <stdio.h>
struct student
{
    char name[50];
    int age;
};

// function prototype
struct student getInformation();

int main()
{
    struct student s;

    s = getInformation();

    printf("\nDisplaying information\n");
    printf("Name: %s", s.name);
    printf("\nRoll: %d", s.age);
    
    return 0;
}
struct student getInformation() 
{
  struct student s1;

  printf("Enter name: ");
  scanf ("%[^\n]%*c", s1.name);

  printf("Enter age: ");
  scanf("%d", &s1.age);
  
  return s1;
}	

输出:

Enter name: lili
Enter age: 18

Displaying information
Name: lili
Roll: 18

共同体 

共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式,同时可以有效地精简内存。定义共用体:为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

共用体占用的内存应足够存储共用体中最大的成员。访问共用体成员:和结构体类似,为了访问共用体的成员,我们使用成员访问运算符()。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。

#include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[30];
};
int main( )
{
   union Data data;        
   data.i = 10;
   data.f = 220.5;
   strcpy( data.str, "C Programming");
   printf( "data.i : %d\n", data.i);
   printf( "data.f : %f\n", data.f);
   printf( "data.str : %s\n", data.str);
 
   return 0;
}

输出:

data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming

        在这里,我们可以看到共用体的 i 和 f 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因。现在让我们再来看一个相同的实例,这次我们在同一时间只使用一个变量,这也演示了使用共用体的主要目的:

include <stdio.h>
#include <string.h>
 
union Data
{
   int i;
   float f;
   char  str[30];
};
int main( )
{
   union Data data;        
   data.i = 10;
   printf( "data.i : %d\n", data.i);
   data.f = 220.5;
   printf( "data.f : %f\n", data.f);
   strcpy( data.str, "C Programming");
   printf( "data.str : %s\n", data.str);
 
   return 0;
}

输出:

data.i : 10
data.f : 220.500000
data.str : C Programming

分析:成员变量正确输出,是因为同一时间只用到一个成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值