实际应用中会有一些不同数据类型组成的数据实体,这些不同的数据类型的数据项是相互联系的,应该组成一个有机的整体。如果用单独的数据项来表示,就不能体现数据的整体性,不便于操作。
C中使用结构体这种数据类型表示这种数据实体。结构体中的数据项称为成员。
结构体类型的定义
模式为:
Struct 结构体变量名 {
成员变量类型 成员变量名;
成员变量类型 成员变量名;
...
}
注意:结构体是用户自定义的类型,与系统定义的基础数据类型一样可以定义变量。
//可见类型这个概念不只是面向对象语言的专利
结构体的成员类型可以是结构体类型,但不能定义自己类型的成员。//这和类的概念不同
结构体类型变量
定义
三种方法定义结构体变量
1.先定义结构体类型在定义变量。
2.定义结构体同时定义变量。
3.直接定义结构体变量。
使用
引用一个结构体变量有两种方式。
1.直接引用:使用变量名引用,使用“.”符号引用。
2.间接引用:使用指向结构体的指针引用,使用“->”符号引用。
变量的初始化
A = {123,"张三",'f',"**学院"}
结构体类型数组
定义:
struct student students[80];初始化:
students = {{123," 张三 "},{124," 李四 "},{...}}使用:...
结构体类型指针
指向结构体变量:
Struct 结构体类型 *指针变量名
指向结构体数组元素:
同数组指针
结构体和函数
结构体变量作为函数参数
老的C标准不允许把结构体变量当作参数传递,只允许传递结构体变量的指针作参。新的C标准和编译系统都允许使用结构体变量作为参数传递。
指向结构体变量的指针作为函数参数
把一个完整的结构体变量作为参数传递虽然合法,但是要将全部成员值一个一个传递费时间又费空间,开销大。如果结构体类型中的成员很多,或者有一些成员是数组,则程序运行效率会大大降低。这种情况下使用结构体变量的指针作为参数传递能提高效率。
函数返回值为结构体类型
此处待续
自己的理解:
结合结构体理解指针:指针的本质是某种变量的地址,他的核心优势是在程序运行中减少寻址的过程,因为当使用一个变量的时候应该先按照变量名找到这个变量的地址(&变量名的过程),然后在针对内存中的数据进行操作。但是如果使用指针的话,就减少了寻址的这个环节。大大节省了程序运行的时间和空间。
改正:[
指针是有省略寻址的优势,但这不是它的核心。指针的核心优势应该是使程序能对某一个内存空间直接进行操作,特别体现在函数才传参上。一个函数接受常规变量的传入参数,则只能对此函数周期中的形参进行操作,而不能改变实参的值。而当你传入一个指针类型的变量参数时,则可以直接操作实参。这是指针的意义所在。
int f(int b) /*b为形参*/
{ return b;}
main()
{int a=1;
printf("%d",f(a));/*a为实参*/
}
]
结构体的概念:因为是先学习了面向对象的语言java所以对对象的概念比较熟悉。C中的结构体类似java中类的概念,二者的本质相近,都是为了封装。只不过java中的类除了封装数据之外还封装了操作(方法),C中的结构体只是封装了数据。另外C中的结构体不能拥有本类型的成员,这个是和java中类的概念不同的。