黑马程序员--C语言中结构体-我之理解

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

什么是结构体?

“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。

为什么要有结构类型?

结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若

传递参数较多,传一个结构体相对而言简单一些,很多系统自带的函数必须用结构体。

1、定义结构体的方法

定义一个结构的一般形式为:

struct 结构名

{

成员表列

};

//定义一个学生的结构

struct student

{ 

int num; 

    char name[20]; //char *name; 

    char sex; 

    float score; 

};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。对每个成员也必须作类 型说明,其形式为:

类型说明符 成员名;

成员名的命名应符合标识符的书写规定。

2.结构体变量及定义方法

1.先定义结构,再说明结构变量。

struct student

{ 

int num; 

    char name[20]; //char *name; 

    char sex; 

    float score; 

}; 

strut student stu1,stu2;

也可以用宏定义使一个符号常量来表示一个结构类型。

#define STU struct stu 

STU{ 

    int num; 

    char name[20]; char sex; 

    float score; 

}; 

STU boy1,boy2;

2.在定义结构类型的同时说明结构变量。

struct stu 

{ 

    int num; 

    char name[20]; 

    char sex; 

    float score; 

}boy1,boy2;

这种形式的说明的一般形式为:

struct 结构名

{

成员表列

}变量名表列;

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

struct 

{ 

    int num; 

    char name[20]; char sex; 

    float score; 

}boy1,boy2;

这种形式的说明的一般形式为:

struct

{

成员表列

}变量名表列;

第三种方法与第二种方法的区别在于第三种方法中省去了结构名,而直接给出结构变量,这种结构体最大的问题是,不能再次定义新的结构体变量了。

------------------结构体变量的初始化-------

1、先定义结构体变量,然后再初始化

struct stu 

{ 

    int num; 

    char name[20]; 

    char sex; 

    float score; 

}; 

struct stu boy1,boy2; 

boy1.num = 1010; 

strcpy(boy1.name, "bbbbb"); 

//boy1.name="cjk"; 

//这是错误的 

//相当于char name[20], name="abc"; 

//如果写成char *name, 则name="abc"可以; 

boy1.sex = ‘f‘; 

boy1.score = 18.0f;

2、定义的同时初始化

1)全部初始化 定义结构体的时候直接初始化

#include <stdio.h> 

#include <_string.h> 

struct stu 

{ 

    int num; 

    char name[20]; 

    char sex; 

    float score; 

} av1={1012,"xzmly",‘f‘,30}; 

//注意 "xzmly"初始化赋值给了name[20]; 

printf("av1.name=%s",av1.name); //初始化的顺序必须与结构体定义的时候成员的顺序一致 

struct stu boy1={1011,"zbz",‘f‘,23}; // 使用另外一已经存在的结构体初始化新的结构体

----------------结构体存储

结构名只能表示一个结构形式,编译系统并不对它分配内存空间。只有当某变量被说明为这

种类型的结构时,才对该变量分配存储空间。

结构体占用的内存空间是每个成员占用的字节数之和(考虑对齐问题)。

-------------------结构体的作用域问题

结构类型定义在函数内部的作用域与局部变量的作用域是相同的 
函数外部定义的结构体类型类似全局变量 
全局作用域:从定义的那一行开始直到本文件结束为止

---------------结构体数组--------------

1、结构数组概念

数组的元素也可以是结构类型的。因此可以构成结构型数组。结构数组的每一个元素都是具 有相同结构类型的下标结构变量。在实际应用中,经常用结构数组来表示具有相同数据结构的一 个群体。如一个班的学生档案,一个车间职工的工资表等。

2、结构数组定义

定义格式:

struct 结构名

{

成员表列

}数组名[数组长度];

-------------结构体数组定义:

结构体数组定义的第一种方式:

1)定义结构体的同时,定义数组 

struct Student 

{ 

    int age; 

    char *name; 

    int s_no; 

    float score; 

}stu[5];

2)先定义结构体,后定义数组

struct Student boy[5];

例如:定义一个长度为5的数组,其中每一个元素都是 stu结构类型

struct stu 

{ 

    int num; 

    char *name; 

    char sex; 

    float score; 

}boy[5];

定义了一个结构数组boy,共有5个元素,boy[0]~boy[4]。每个数组元素都具有struct stu的结 构形式。

----------结构数组的初始化

1、定义结构体数组的时候,进行初始化

    struct Student{ 

         char name[20]; 

        int age; 

    }boys[3]={{"sb",18},{"zbz",38},{"cgx",28}};

2、定义的同时进行初始化

    struct Student girls[2]={{"fengjie",18},{"cjk",28}};

3、先定义后初始化,整体赋值

 struct Student ds[2]; 

    ds[0]=(struct Student){"xzmly",18}; 

    ds[1]=(struct Student){"bdjy",18};

4、先定义结构体数组,后初始化

    struct Student stu[2]; 

    //stu[0].name = "zhangsan"; 

    //strcpy(stu[0].name,"zhangsan"); 

    scanf("%s",stu[0].name);

-------------结构数组遍历

struct Student{ 

          char name[20]; 

        int age; 

    }boys[3]={{"sb",18},{"zbz",38},{"cgx",28}}; 

for(int i=0;i<3;i++){ 

         printf("name:%s,age:%d\n",boys[i].name,boys[i].age); 

    }

----------------------结构指针定义和初始化  -----------------

1、指向结构体变量的指针

一个指针变量当用来指向一个结构变量时,称之为结构指针变量。结构指针变量中的值是所指向 的结构变量的首地址。通过结构指针即可访问该结构变量,这与数组指针和函数指针的情况是相 同的。

结构指针变量说明的一般形式为:

struct 结构名 *结构指针变量名

例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu, 可写为:

struct stu *pstu; //定义了指针只能指向stu结构体类型的结构体变量

当然也可在定义stu结构时同时说明pstu。与前面讨论的各类指针变量相同,结构指针变量也必须 要先赋值后才能使用。

赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量。

如果boy是被说明为stu类型的结构变量, 则:

pstu=&boy 是正确的,

而:

pstu=&stu 是错误的。

2、结构名、结构体变量名、结构体指针

结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不 对它分配内存空间。只有当某变量被说明为这种类型的结构时,才对该变量分配存储空间。结构 指针变量,就是用来存储结构体变量地址的,就能更方便地访问结构变量的各个成员。

------结构体指针间接访问成员值

其访问的一般形式为:

(*结构指针变量).成员名

或为:

结构指针变量->成员名

----------结构体嵌套使用

1)成员也可以又是一个结构,即构成了嵌套的结构

结构体嵌套:结构体定义的里面有其他结构体

结构体不可以嵌套自己变量,可以嵌套指向自己这种类型的指针

如:

struct Date 

{ 

    int month; 

    int day; 

    int year; 

} 

struct  stu 

{ 

    int num; 

    char *name; 

    char sex; 

    struct Date birthday; 

    float score; 

}

------------------结构体指针作为函数的参数 -----------

时间: 2024-10-12 18:43:25

黑马程序员--C语言中结构体-我之理解的相关文章

黑马程序员——c语言中结构体的使用以及注意事项和实际应用

1.结构体和数组的区别①结构体:结构体可以由多个不同类型的数据构成,可以 包含int double等多种类型②数组:数组则只能由多个相同类型数据构成 2.结构体的定义①先定义结构体类型 struct Person { int age; //age height name 三个变量可以称之为结构体成员或者属性 double height; char*name; } ②根据结构体类型定义结构体变量 struct Person p={20,1.75,"tom"}; p.age=30; p.n

黑马程序员---C语言基础---结构体

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ C语言基础---结构体 一.什么是结构体 介绍结构体之前,我想先简单介绍下数组.我想大家对数组都再熟悉不过了,顾名思义,数组就是将一些数据(元素)组合在一起,作为一个整体.使用数组需要注意的是这些元素必须是相同类型.而结构体和数组类似,也是将一些数据组合在一起作为一个整体,但是这些元素可以是不同类型.可以这么理解:结构体是更加灵活的数组,因为它允许元素是不同的类型. 实际生活中,如果我们要

黑马程序员--C语言中的结构体

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 结构(struct)      结构是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合.  结构中可以使用不同的数据类型.      1. 结构说明和结构变量定义      在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此,  象其它  类型的变量一样, 在使用结构变量时要先对其定义.      定义结构变量的一般格式为:       struct 结构名   

黑马程序员-C学习日记-结构体

------- ios培训. android培训.java培训.期待与您交流! ---------- 一.局部变量与全局变量 1.局部变量:定义在函数内部的变量以及函数形参称为局部变量 作用域:从定义的那一行开始直到其所在的代码块结束 生命周期:从程序运行到定义那一行开始分配存储空间到程序离开该变量所在的作用域 特点:(1)相同作用域内不可以定义重名变量 (2)不同作用域可以定义重名变量,内部作用域变量可以覆盖外部作用域变量 2.全局变量:函数外部定义的变量 声明: 数据类型 变量名称 定义: 

黑马程序员— C语言选择结构和循环结构的总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在学习完C语言的流程控制后,发现选择结构跟循环结构都各自有各自的特点,下面就来对选择结构与循环结构进行一个综合的总结 第一讲  选择结构与循环结构 选择结构主要包括if语句和switch语句,而循环结构包括for循环,while循环以及do while循环: 一 选择结构 1.if(条件){ }else if(条件2){ }else{ } 特点:同一时刻只有一个大括号里面的代码会执行. 2.s

黑马程序员--C语言中的指针(3)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 指向多维数组的指针变量 本小节以二维数组为例介绍多维数组的指针变量. 一.多维数组地址的表示方法 设有整型二维数组a[3][4]如下: 0 1 2 3 4 5 6 7 8 9 10 11  设数组a的首地址为1000,各下标变量的首地址及其值如图所示.在第四章中介绍过, C语言允许把一个二维数组分解为多个一维数组来处理.因此数组a可分解为三个一维数组,即a[0],a[1],a[2].每一个一维

黑马程序员--C语言中的指针(4)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 使用字符串指针变量与字符数组的区别 用字符数组和字符指针变量都可实现字符串的存储和运算. 但是两者是有区别的.在使用时应注意以下几个问题: 1. 字符串指针变量本身是一个变量,用于存放字符串的首地址.而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘/0’作为串的结束.字符数组是由于若干个数组元素组成的,它可用来存放整个字符串. 2. 对字符数组作初始化赋值,必须采用外部类型或静态

黑马程序员--C语言中的指针(5)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 指针型函数 前面我们介绍过,所谓函数类型是指函数返回值的类型. 在C语言中允许一个函数的返回值是一个指针(即地址), 这种返回指针值的函数称为指针型函数. 定义指针型函数的一般形式为: 类型说明符 *函数名(形参表) { …… /*函数体*/ } 其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针.类型说明符表示了返回的指针值所指向的数据类型. 如: int *ap(int 

黑马程序员--C语言中的指针(6)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 本章小结 1. 指针是C语言中一个重要的组成部分,使用指针编程有以下优点: (1)提高程序的编译效率和执行速度. (2)通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯. (3)可以实现动态的存储分配. (4)便于表示各种数据结构,编写高质量的程序. 2. 指针的运算 (1)取地址运算符&:求变量的地址 (2)取内容运算符*:表示指针所指的变量 (3)赋值运算 ·把