黑马程序员——结构体

------  Java培训、Android培训、iOS培训、.Net培训期待与您交流! ------

        http://www.itheima.com


  • 结构体:不同类型数据组成的一种数据结构组织,它是一种构造类型。
  • 结构体作用:有些问题仅用基本类型和数组来描述,无法反映其内在联系,如学生情况: 包括姓名、年龄、成绩等,结构体可以将其构造成一个整体,这个整体里面的数据既相互独立又相互关联。
  • 结构体的定义:
struct 结构体名{
类型说明符 成员名
类型说明符 成员名
.......
}
  • 结构体变量定义:1、先定义结构,再定义结构变量:
struct student {

char  name[22];

float  score;

int      num;

};

struct student stu1;

2、在定义结构类型的同时定义结构变量:

struct student {

 char  name[22];

float  score;

int      num;

}stu1;

3、匿名结构体定义结构变量:

struct  {

char  name[22];

float  score;

int      num;

}stu1;

注意点: 1、结构体类型与结构体变量概念不同,声明结构体类型时不分配存储单元,使用该类型定义变量时才分配存储单元。

2、结构体成员名与程序中变量名可相同,两者不代表同一个对象。

  • 结构体变量的引用:结构变量名.成员名,结构体变量不能整体引用,只能引用变量成员。如果结构体成员本身又是一个结构体类型,则需要找到最低一级的成员,如:

struct student {

 char  name[22];

float  score;

int      num;

struct date {

 int month;

 int day;

 int year;

 }birthday;

  }stu1;   

访问形式:stu1.birthday.month=10;

  • 结构体变量的初始化:
形式1:

struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;

………….
};
struct 结构体名 结构体变量={初始化数据};
形式2:

struct 结构体名
{ 类型标识符 成员名1;
类型标识符 成员名2;
…………
} 结构体变量={初始数据};

形式3:

struct { 类型标识符 成员名1;
     类型标识符 成员名2;
…………
} 结构体变量={初始数据};

  • 结构体作用域:根据作用域可以分为全局结构体、局部结构体。在函数的内部或者代码块的内部定义的结构体,称为局部结构体,其作用域从局部结构体定义的位置开始,到它所在的代码块或者函数体的“}”为止;在函数的外部定义的结构体是全局结构体,从定义的位置开始,到文件末尾,在不同的函数中都可以使用。
  • 结构体数组:

概念:具有相同结构的结构体变量组成的数组。

直接定义:

 struct 结构体名
{ 类型标识符 成员名1;
  类型标识符 成员名2;
…………
} 数组名[数组长度];

间接定义:

struct 结构体名
{ 类型标识符 成员名1;
  类型标识符 成员名2;
…………
};

struct 结构体名  数组名 [数组长度];

初始化:可以在定义结构体数组时初始化,也可以先定义结构体数组然后初始化。

  • 结构体指针:

概念:指向结构体变量的指针。

定义形式: struct 结构体名 *结构体指针名; 注意:结构体指针变量中的值存放的是结构体变量在内存中的首地址;结构体指针加一将指向内存中下一个结构体。

结构体指针间接访问成员值:结构指针变量->成员名 或者 (*结构指针变量).成员名,注意:第二种访问形式括号不能省。

  • 结构体变量以及成员变量值作为函数的参数实质上是值传递。
  • 结构体指针作为函数参数是地址传递,如下面代码通过结构体指针间接访问来修改成员变量值:

#include <stdio.h>

struct Stu{

    float score;

    int age;

};

void test(structStu *c){

    c->score = 98.4f;

}

int main(int argc,constchar * argv[]) {

    //定义一个结构体变量并初始化

    struct Stu stu={78.3f,23};

    //定义结构体指针并初始化

    struct Stu *p=&stu;

    //结构体指针作为函数参数是地址传递

    test(p);

    printf("%.1f\n",stu.score);

    return 0;

}

打印结果是98.4。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值