《C Prime Plus》14.7学习笔记

114 阅读3分钟

结构与函数

结构本质上也只是一种变量,只不过它不是简单变量,而是由多种变量复合而成。既然是变量,那么就必然要和函数、文件打交道了。前面的学习中,函数的参数以及指针啥的都是极为重要的内容,那他们对于结构又是什么体现呢?

结构成员作为函数形参

结构的成员只要是确切的单个值的数据类型,就可以作为参数传递给函数。

struct Example{char ch; int i};
void function(char a,int b);
struct Example A{'X',10};
function(A.ch,A.i);

不过,由于这个函数的形参不是指针,所以上述代码传递的只是一个副本,不会改变传递进去的结构原本的数据。

结构的地址作为函数形参

如果要利用函数修改结构的成员的值,就必须将地址作为参数传递进函数中。

#include <stdio.h>
struct Example{char ch; int i;};
void function(struct Example * ex){
    ex->ch='D';
    ex->i=20;
    };
int main(void){
struct Example A={'X',10};
function(&A);
putchar(A.ch);
printf("%d",A.i);
return 0;
}

上述代码中,function()把结构A的成员的值均修改掉了。因为传递的是结构A的地址。

传递结构本身

结构是变量,本身就可以作为参数传递入函数。

#include <stdio.h>
struct Example{char ch; int i;};
void function(struct Example ex){printf("%c\n%d\n",ex.ch,ex.i);};
int main(void){
struct Example A={'X',10};
function(A);
return 0;
}

这里function()接收了结构变量A,将A的成员打印了出来。实际上,是function接收了结构变量A的数据,把A的数据给了自己的参数结构ex,然后把ex的成员打印了出来。ex是一个副本。

传递结构还是传递结构指针?

对于这个问题,书中给出的结论是,还是以指针为主,如果不想修改作为参数的结构,那就把形参加上const即可。

结构与malloc()

对于结构中的成员,可以在声明结构模板时只声明指针,然后在初始化时,可以用malloc()来申请分配一块内存,把malloc()返回的内存地址赋给对应的指针成员,这样做更加灵活。

当然,malloc()一定要和free()配套使用,用就得还嘛,所以,一定要记住程序不再使用这个结构后,将内存free掉,更加方便的,如果这个结构模板里面成员全都是指针,那就做一个接收指针地址的函数,函数内是将结构里所有成员所指向的内存free掉,一气呵成。

结构数组与函数

如果函数要处理一个结构数组,那么把结构数组的数组名传递给函数即可,因为结构数组也是数组,数组名就是首元素的地址,没毛病。

小结

不要把结构想象的太难了,它本质也只是变量罢了,只是内涵要更丰富。不要把它和字符串、数组混为一谈,字符串和数组是变量的集合,而结构是多个变量的有机结合体,它本身也依然没有逃离变量的范畴。总而言之,在函数眼里,结构可以适用于大部分普通变量的操作。