C语言结构体学习笔记——控制组

一.结构类型的声明

1.声明形式

例如:`#include<stdio.h>

      struct date {
       int year;
      int month;
      int day;
      };`

struct是一个关键字,而大括号中的变量是结构中的成员。
即每一个struct date 类型的变量中都有 year month 和day 这三个成员。
其他形式:`#include<stdio.h>

          struct date {                               struct{
          int year;                                     int year;
          int month;                                    int month;
          int day;                                      int day;
          }d1,d2,d3;                                  }d1,d2,d3;

第一和第二种形式都声明了该结构类型的名字date,而第三种没有声明,只是定义了d1,d2,d3三个变量。

2.声明的位置

一般不建议在函数内部声明,因为函数的作用域与函数相类似,若在所有函数之前进行定义声明,则在任意函数内均可使用。

二.结构变量的赋值

1.说明

在声明完某一结构类型之后,可以定义任意多个该类型的结构变量,而每个结构变量均包含此结构类型中的所有,比如上述struct date中的year,month和day。

2.赋值方式

#include<stdio.h>
int main(){
struct date {
           int year;
          int month;
          int day;
          };
struct today = {2014,9,26}://第一种
struct thismonth = {.year=2014,.month=9}://第二种 

以上第一种定义方式,是依次按声明时的顺序分别给出对应的值并填入;
第二种定义方式则用到了“ . ”运算符,只给其中一或几个值赋值,其他未赋值的初始值为零。

3.写一个函数以进行输入

struct date shuru(){
    struct date D;
    scanf("%d",&D.year):
    scanf("%d",&D.month):
    scanf("%d",&D.day):
    return D;

//在使用时
struct date Date1 ={0,0,0}:
Date1 = date D();

在此函数中,我们定义了一个新的同类型的结构变量,通过对其进行赋值,并将这个结构变量整体作为函数返回值,即可完成对原结构变量赋值的任务。因为结构变量之间可以直接进行赋值,在三中有详解。

三.结构与数组

结构和数组有一定的相似
数组用[]运算符和下标来对其中成员进行访问,而结构用的是 . 运算符和成员名称来进行访问。

a[0] = 10;
date.today=30;

诸如此类。

四.结构运算

1.结构的访问

1.要访问某个结构,直接用结构变量的名字(并非结构类型的名字)。

2.结构的各种运算

1.结构变量的赋值

date1 = (struct date){2014,9,26};
date2 = date1;

两种赋值方式均可行,而在数组中均不可行。

2.取地址以及做函数参数

a.取地址:
须得用到&运算符,不能像数组那样只用变量名称a 代替&a。
b.做函数参数:
以上述date 为例,做函数参数时形式为:

int hanshu{struct date Date}

整个结构可以作为参数的值传入函数
但此时是在函数内部新建了一个结构变量 并复制了调用者所传入的结构的值。
自然也可以返回一个结构。

五.运算符优先级

scanf("%d %d",&Date.day,&Date.month);

我们知道在scanf语句中,应该是&运算符+一个变量,来进行访问赋值。因此:
&运算符的优先级低于 . 运算符,即上述语句中先进行了Date.day 和 Date.month的运算,再进行了&运算。

六.指向结构的指针

先上代码:

struct point(
      int x;
      int y;
      }crazy;
struct point *p = &crazy;
(*p).x = 1;
p->x = 1;

现在我们有类型名称为point 的叫做crazy的结构变量以及一个指向该变量的指针p。
代码的最后两行是等效的
要点1.:“ . ”运算符的优先级高于*运算符,故须(*p)加括号。
要点2:即指向结构的指针的特殊的第二种形式。“p所指的结构变量中的成员”

七.结构数组

struct point(
      int x;
      int y;
      }
struct point array[10]=
      {{1.2},{3,4}}:      

在上述代码中,我们定义了一个名为array的结构数组,其中包含了十个结构类型为point的结构变量
并且我们对其进行了一部分赋值,最外层的{}代表赋值,里层{}代表数组中每一个变量所包含的值。

八.嵌套结构

先看代码

struct point(
      int x;
      int y;
      }:
struct rectangle {
      struct point p1;
      struct point p2;
      }rec:      

1.表示形式

以上rectangle结构中包含着两个类型为 point 的结构变量,在访问变量时,有以下几种形式:

rectangle.p1.x;
rectangle.p1.x;

若再加上一个指针r的话

struct rectangle *r = &rec;

以下几种形式是等价的:

r.p1.x;
r->p1.x;
(r.p1).x;
(r->p1).x;
// ->仅用于指针

2.嵌套结构与数组相结合

若有一个数组recs其中的单元为上述的结构 rectangle,则对其进行赋值时,形式就会比较复杂:

struct rectangle rects[10];
rects[10]={
  {{1,2},{3,4}},
  {{3,4},{7,8}}
  };

很多层的嵌套自然也能实现,只要在输入的时候环环相扣 十分细心就没有问题,不过实际意义可能不与付出成正比

九.typedef

1.功能

声明一个已有的函数类型的新名字。
例: typedef int Length;
在声明了之后,Length 就可以 代替 int 出现在变量定义和参数声明的地方。

2.作用及意义

简化了类型名称,改善了程序的可读性,具有可移植性

3.形式

typedef struct point(
      int x;
      int y;
      }Point:
Point p = {1,2};

Point 就等效于在用typedef之前的 struct point。
或者简单点,在声明完结构类型point之后:

typedef struct point Point;

“Point” 等效于其与typedef之间的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值