结构与函数
结构本质上也只是一种变量,只不过它不是简单变量,而是由多种变量复合而成。既然是变量,那么就必然要和函数、文件打交道了。前面的学习中,函数的参数以及指针啥的都是极为重要的内容,那他们对于结构又是什么体现呢?
结构成员作为函数形参
结构的成员只要是确切的单个值的数据类型,就可以作为参数传递给函数。
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掉,一气呵成。
结构数组与函数
如果函数要处理一个结构数组,那么把结构数组的数组名传递给函数即可,因为结构数组也是数组,数组名就是首元素的地址,没毛病。
小结
不要把结构想象的太难了,它本质也只是变量罢了,只是内涵要更丰富。不要把它和字符串、数组混为一谈,字符串和数组是变量的集合,而结构是多个变量的有机结合体,它本身也依然没有逃离变量的范畴。总而言之,在函数眼里,结构可以适用于大部分普通变量的操作。