C语言学习笔记:结构体在自定义函数中的使用

0. 引言

众所周知,在C语言中如果希望设置的变量能够在自定义函数中使用且能够传递至自定义函数外使用,指针是最好的选择。
但是对于结构体,指针改怎么用呢?

1. 结构指针的声明

声明结构指针很简单,例如:

struct guy *him;

这个语法和其他指针声明一样。但是,该声明并未创建一个新的结构,而是指针him现在可以指向任意现有的guy类型的结构。例如,如果barney是一个guy类型的结构,可以这样写:

him = &barney;

和数组不同的是,结构名并不是结构的地址,因此要在结构名前加上&运算符。

2. 用指针访问成员

  1. 第一种表示方法也是最常用的方法,用->运算符:
    如果him == &barney,那么him->income即是barney.income
    另外,至于->与.的转换,在大部分的智能编译器里都可以自动转换。

这里着重理解him是一个指针,但是hime->income是该指针所指向结构的一个成员。因此在该例中,him->income是一个float类型的变量。

  1. 第二种表示方法为: c barney.income = (*him).income = him->imcome

3. 传递结构的地址

要解决我们开头的问题,我们必须传递结构的地址而不是结构,我们可以用下面的例子来介绍如何传递结构的地址:

#include 
#define FUNDLEN 50
struct funds {
char   bank[FUNDLEN];
double  bankfund;
char   save[FUNDLEN];
double  savefund;
};
double sum(const struct funds *); /* 参数是一个指针 */
int main(void)
{
struct funds stan = {
"Garlic-Melon Bank",
4032.27,
"Lucky's Savings and Loan",
8543.94
};
printf("Stan has a total of $%.2f.\n", sum(&stan));
return 0;
}
double sum(const struct funds * money)
{
return(money->bankfund + money->savefund);
}

运行后该程序输出如下:
Stan has a total of $12576.21.
sum()函数使用指向funds结构的指针(money)作为它的参数。把地址 &stan传递给该函数,使得指针money指向结构stan。然后通过->运算符获取stan.bankfund和stan.savefund的值。由于该函数不能改变指针所指向值的内容,所以把money声明为一个指向const的指针。虽然该函数并未使用其他成员,但是也可以访问它们。

注意,必须使用&运算符来获取结构的地址。和数组名不同,结构名只是其地址的别名。

为了简化表示符号,我们可以直接定义如下:

typedef struct funds* funds_object;

4. 结构体的初始化

另外,必须要提醒的是,要想在自定义函数中正常地传递结构体地址,必须要对结构体先进行初始化,否则将会出现传递地址后无效的结果

参考文献

[1] Prata S. C primer plus[M]. Pearson Education, 2014.

你可能感兴趣的:(C语言学习笔记)