声明结构指针和用指针访问成员

120 阅读2分钟

我正在参与掘金创作者训练营第5期,点击了解活动详情

指针的优点

  • 指向结构的指针通常比结构本身更容易操控
  • 传递一个结构,传递指针更有效率
  • 用于表示数据的结构中包含指向其他结构的指针

举一个简单例子:使用指针定义结构和访问结构成员

#include <stdio.h>
#define LEN 20
struct names {
    char first[LEN];
    char last[LEN];
};
struct guy{
    struct names handle;
    char favfood[LEN];
    char job[LEN];
    float income;
};
int main(){
    struct guy fellow[2] = {
        {{"Ewen","Villard"},
           "grilled salmon",
            "personaality coach",
            68112.00
        },
        {{"Rodney","Swillbelly"},
            "tripe",
            "tabloid editor",
            432400.00
        }
    };
    struct guy*him;  //这是一个指向结构指针
    printf("address #1:%p #2:%p\n",&fellow[0],&fellow[1]);
    him = &fellow[0];  //告诉编译器该指向何处
    printf("pointer #1:%p #2:%p\n",him,him+1);
    printf("him->income is $%.2f:(*him).income is $%.2f\n",him->income,(*him).income);  //指向下一个结构
    him++;
    printf("him->favfood is %s:him->handle.last is %s\n",him->favfood,him->handle.last);
    return 0;
}

运行结果

Snipaste_2022-08-06_10-52-59.png

声明和初始化结构指针

声明一个结构指针: struct guy * him

第一个是关键字struct,然后是星号( * ),后面跟着指针名。

虽然没有创建新的结构,但是指针him可以指向任意现有的guy类型的结构。例如,如果apple是guy类型的结构变量,可以这样表示: him = &apple 与数组不同,结构变量名不是结构地址,所以一定要在结构变量名前面加上取地址运算符(&)。

上面举例中,fellow是一个结构数组,所以fellow[0]是一个结构,让him指向fellow[0],可以这样表示:him=&fellow[0];

him指向fellow[0],him+1指向fellow[1]。

用指针访问成员

him获取fellow[0]的成员的值,有两种方法:

  • 使用->这个运算符。例如:

如果him == &barney,那么him->income即是barney.income

如果him == &fellow[0],那么him->income即是fellow[0].income

指向结构的指针后面的->运算符和结构变量名后面,都是一样的。

him是一个指针,但是him->income是指向结构的一个成员。因此,him->income是float类型的。

  • 如果him == &fellow[0],那么* him == &fellow[0],因为&和* 是一对互逆运算符。可以换成这样表示:fellow[0].income == (*him).income

必须使用圆括号,因为.运算符比* 运算符的优先级高。

如果him是指向guy类型结构barney的指针,下面成立:

barney.income == (*him).income == him->income  //假设him == &barney