[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)

学习笔记

《深入理解C指针》
http://www.ituring.com.cn/book/1147
第6章 指针与结构体

一、声明结构体

[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第1张图片
声明C 结构体
  • 使用结构体的简单声明,要使用点表示法
/// 使用结构体的简单声明,要使用点表示法
    Person person;
    person.firstName = (char*)malloc(strlen("Emily")+1);
    strcpy(person.firstName,"Emily");
    person.age = 23;

    printf("age: %d\n", person.age);
  • 使用结构体指针,要用箭头操作符
    /// 使用结构体指针,要用箭头操作符
    Person *ptrPerson;
    ptrPerson = (Person*)malloc(sizeof(Person));
    ptrPerson->firstName = (char*)malloc(strlen("Emily")+1);
    strcpy(ptrPerson->firstName,"Emily");
    ptrPerson->age = 23;

    printf("age: %d\n", ptrPerson->age);

  • 还可以先解引指针然后用点操作符
    Person *ptrPerson;
    ptrPerson = (Person*)malloc(sizeof(Person));
    (*ptrPerson).firstName = (char*)malloc(strlen("Emily")+1);
    strcpy((*ptrPerson).firstName,"Emily");
    (*ptrPerson).age = 23;

为结构体分配内存

  • short2个字节,结构体末尾自动填充了2个字节,使得整个结构体保持为16字节16可以被4整除
    [C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第2张图片
    为结构体分配内存

二、释放结构体

1、使用简单结构体声明

Person person;
initializePerson(&person, "Peter", "Underwood", "Manager", 36);
...
deallocatePerson(&person);

[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第3张图片
使用简单结构体声明
[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第4张图片
图6-3:初始化的Person结构体
  • Person person; 本质就是一个函数局部变量,只不过这个变量是一个结构体变量,按照结构体定义中的规范(由 3个char* 1个int) 组合起来的;

  • 结构体中有3个char*,都是使用malloc在函数内动态分配的内存,我们知道,不管你在哪里使用malloc,只要是使用的malloc,那就是在上分配内存给你;

  • 那么, 即便在函数执行结束后,局部变量person不复存在了, 但是那些通过malloc上分配的内存还是存在的,因此需要通过deallocatePerson(&person);来做到真真正正地释放

2、指向person实例的指针

Person *ptrPerson;
ptrPerson = (Person*) malloc(sizeof(Person));
initializePerson(ptrPerson, "Peter", "Underwood", "Manager", 36);
...
deallocatePerson(ptrPerson);
free(ptrPerson);

[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第5张图片
使用结构体指针
[C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;)_第6张图片
图6-4:指向person实例的指针
  • 当我们使用的是结构体指针时,首先, Person *ptrPerson; 表示指针本身是属于函数的局部变量,其次, ptrPerson = (Person*) malloc(sizeof(Person));这里明明白白的malloc再次告诉我们,局部指针变量指向的内存还是从堆上分配的;

  • 那么, 在函数执行完毕前,我们不仅需要释放结构体里面使用到的内存们(由3个char*引起),用deallocatePerson(ptrPerson);,而且还需要释放ptrPerson指针指向的内存,用 free(ptrPerson);

你可能感兴趣的:([C指针]指针与结构体:(Person person; )VS (Person *ptrPerson;))