C语言中关于普通变量和指针变量、结构体包含子结构体或包含结构体指针的一些思考
《2》普通变量是静态的,指针变量是动态的。这里的静态和动态是指能否修改。
试想一下在函数传参的时候复制一个普通变量和一个指针类型变量的值。普通变量赋值后,将变量的值复制给参数,在函数内部是无法对这个变量的值进行修改的,而指针变量就可以在函数内部对指向的真实变量进行修改。(从这里看出指针变量的灵活性,特点,以及威力)
《2》、C语言中大量存在赋值“=”操作,效率最高的就是普通变量赋值或者指针变量这种1字节、2字节、4字节赋值操作,C语言非常擅长这种小变量赋值操作以及指针或者指针变量解引用操作,而且这些操作效率非常高。如果直接复制整个结构体,效率非常低,这也是为什么传参中使用结构体变量指针的原因,反正后面可以使用函数体内部使用结构体指针解引用的方式访问成员。
《3》结构体内部使用结构体指针的好处以及必须使用结构体指针的相关情况:
(1)当使用堆内存的时候,也就是使用malloc()、free()相关函数动态申请释放内存的时候,必须要使用结构体指针。而且需要使用的时候再申请内存,使用完了可以释放内存,非常节约内存。
(2)定义一个结构体指针,它存储的或者被写入的是某一个结构体的地址,这个被指向的结构体编译器可以在存储在其他内存地方,有点像碎片内存,这样指向的内存就无需和当前结构体在一起,有利于编译器对内存碎片化操作。
(3)使用结构体指针可以节省内存大小,我们都知道指针变量也就是占4字节内存空间,当我们定义多个结构体变量的时候,使用结构体指针更节省内存,而且效率更好,因为定义变量就是编译器分配内存,内存格子越小,效率越高。
(4)结构体内部包含子结构体,那么这两个结构体在空间上必须挨在一起,时间上(生命周期)保持一致,无法提前释放,也就是说在空间和时间上两者会一直存在,无法改变。
(5)从继承角度考虑,结构体内部使用结构体指针也更有优势,子结构体只需定义一个父结构体的指针变量就相当于继承了父结构体的相关特性(数据以及函数指针)。否则如果包含父结构体整体,随着继承层数的增多,占用内存越来越大,效率越来越低,后面会存在大量空闲的内存,而且也不符合自然规律(只有一个父亲,一个儿子,不能随着继承层数增多,儿子、父亲越来越多)。
总之结构体内部包含子结构体,在空间和时间上绑定在了一起,而且占用内存大,生命周期长,效率地下,容易造成内存浪费,尽量少使用。
结构体内部包含结构体指针,空间上占用内存小,可以按需分配,生命周期也可以程序员自我把握,执行效率高(创建过程、复制过程),而且动态灵活(可以修改指向的结构体成员)。