C指针和结构体

我们可以使用C的结构体来表示数据结构元素,比如链表或树的节点,指针是把这些元素联系到一起的纽带。理解指针对常见数据结构多种功能的支持可以为创建数据结构提供便利。在本章中,我们会探索C中结构体内存分配的基础和几种常见数据结构的实现。

结构体加强了数组等集合的实用性。要创建实体的数组(比如有多个字段的颜色类型),如果不用结构体的话,就得为每个字段声明一个数组,然后把每个字段的值放在每个数组的同一个索引下。不过,有了结构体,我们可以只声明一个数组,其中的每个元素是一个结构体的实例。

声明C结构体的方式有多种。本节只看其中两种,因为我们主要关注的是结构体和指针的配合使用。在第一种方法中,我们用struct关键字声明一个结构体。在第二种方法中,我们使用类型定义。在下面的声明中,结构体的名字前面加了下划线,这不是必需的,不过通常作为命名约定。_person结构体包括了名字、职位和年龄三个字段。

struct _person {
    char* firstName;
    char* lastName;
    char* title;
    unsigned int age;
};

结构体的声明经常使用typedef关键字简化之后的使用。下面说明如何对_person结构体用typedef关键字:

typedef struct _person {
    char* firstName;
    char* lastName;
    char* title;
    unsigned int age;
} Person;

person的实例声明如下:

Person person;

我们也可以声明一个Person指针并为它分配内存,如下所示:

Person *ptrPerson;
ptrPerson = (Person*) malloc(sizeof(Person));

如果使用结构体的简单声明(像person那样),那么就用点表示法来访问其字段。在下例中,我们给firstNameage字段赋了值:

Person person;
person.firstName = (char*)malloc(strlen("Emily")+1);
strcpy(person.firstName,"Emily");
person.age = 23;

不过,如果使用结构体指针,就需要用箭头操作符,如下所示。这个操作符由一个横线和一个大于号组成:

Person *ptrPerson;
ptrPerson = (Person*)malloc(sizeof(Person));
ptrPerson->firstName = (char*)malloc(strlen("Emily")+1);
strcpy(ptrPerson->firstName,"Emily");
ptrPerson->age = 23;

我们不一定非得用箭头操作符,可以先解引指针然后用点操作符,如下所示,我们又执行了一遍赋值操作:

Person *ptrPerson;
ptrPerson = (Person*)malloc(sizeof(Person));
(*ptrPerson).firstName = (char*)malloc(strlen("Emily")+1);
strcpy((*ptrPerson).firstName,"Emily");
(*ptrPerson).age = 23;

这种方法有些笨拙,不过你偶尔还能看到有人使用它。

赞(1)

评论 抢沙发

评论前必须登录!

 

C指针