C语言结构体及面向对象思想的初步引入

前言

本章将是C语言基础部门的收尾部门,将会学习结构体,为后来的数据结构做铺垫,初步了解面向对象的思想,为以后学习C++,java,python等以面向对象为特色的语言做一个好的铺垫。那么现在开始!(ᕑᗢᓫ∗)˒

结构体

结构体的定义

  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

声明结构体

struct tag
{
    member - list;//这个地方叫做结构体的成员
}variable - list;//这个地方是结构体的声明变量

举个栗子

typedef struct Stu//这句是typedef语句,将声明原本的struct Stu 换成了 Stu
{
    char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
}Stu;//分号不能丢

结构成员的类型

结构的成员可以是标量、数组、指针,甚至是其他结构体。从上面的栗子中其实也可以看出。

结构体变量的初始化

有了结构体类型,那如何定义变量,其实很简单。

struct Point
{
    int x;
    int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = { x, y };
typedef struct Stu        //利用typedef进行声明
{
    char name[15];//名字
    int age;      //年龄
}Stu;
Stu s = { "zhangsan", 20 };//初始化
struct Node
{
    int data;
    struct Point p;
    struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

结构体成员的访问

结构体直接访问

如果结构体直接访问,那么结构体中的成员都是通过 ". "这个符号来访问的。

struct Stu
{
    char name[20];
    int age;
};

struct Stu s;//初始化完成
int age = s.age;//这样就能够对于结构体成员进行访问

通过指针进行间接的访问

有时候我们没法直接对于指针进行访问,例如当我们使用函数时,很多时候就会传递一个指针,那么我们又要怎么访问呢?

有两种方法。

struct Stu
{
    char name[20];
    int age;
};
void print(struct Stu* ps)//我们在传参时都要使用这种方式,这样会将地址一个个入栈。
//void print(struct Stu ps) 如果是这种方式,会将整个结构体一次性全部传入,导致爆栈的出现。
{
    printf("name = %s   age = %d\n", (*ps).name, (*ps).age);//这种就是将指针类型变成结构体进行访问
    printf("name = %s   age = %d\n", ps->name, ps->age);    //使用结构体指针访问指向对象的成员
}
int main()
{
    struct Stu s = { "zhangsan", 20 };
    print(&s);//结构体地址传参
    return 0;
}

面向对象的初步引入

C语言是面向过程的,而C++是面向对象的,然而何为面向对象,什么又是面向过程呢?

  • 面向过程,我认为过程就是步骤,是解决问题的按部就班。
  • 面向对象:就是构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

不管怎么样,我们最原始的目标只有一个就是实现我们所需要的功能,从这一点说它们是殊途同归的。过程与对象只是侧重点不同而已。

准确的说,面向对象是一种思想,和语言本身无关。

面向过程的方法写出来的程序是一份蛋炒饭,而用面向对象写出来的程序是一份盖浇饭。

盖浇饭的好处就是”菜”“饭”分离,从而提高了制作盖浇饭的灵活性。饭不满意就换饭,菜不满意换菜。用软件工程的专业术语就是”可维护性“比较好,”饭” 和”菜”的耦合度比较低。

蛋炒饭将”蛋”“饭”搅和在一起,想换”蛋”“饭”中任何一种都很困难,耦合度很高,以至于”可维护性”比较差。

当然面向过程的性能要比面向对象高,对象需要实例化,开销比较大。炒饭还是盖饭,适合的才是最好的。

随着软件需求的变化,我们的代码不断的增加,面向对象的方法,无疑更加容易扩展,及管理维护。

面向对象的三大特性是:封装、继承和多态

具体的定义和详细的说明我们这里不讲,我们只是简单的引入一下。

封装,我们就是将不同的数据,合成一个对象,使这个对象有包括一堆的属性和行为,是不是感觉和结构体很像,确实是这样的,但是封装成的对象不止有属性,还有行为,也就是函数。

继承和多态就就交给你们在c++中多加学习了。

结语

C语言基础部分就到这里结束了,完结撒花,◝(⑅•ᴗ•⑅)◜..°♡。不知道你们看到这里是什么样的心情,感谢你们可以看到这里,C语言基础是你们成为编程大佬的起点,也是你们大学的开始,祝福你们大学四年生活充实,做题天天AC,学习成绩都是95+,有缘再见,各位!

꒰ᐢ⸝⸝•༝•⸝⸝ᐢ꒱