深入理解c语言指针-第六章

来源:互联网 发布:牡丹江管理局电视网络 编辑:程序博客网 时间:2024/06/07 08:16
    ////指针和结构体    /////结构体也可以通过malloc创建空间??????????为何要与typedef联系在一起     /*        结构和数组的不同:            数组是由相同类型的数据组成的,所以它的每一项的长度都是相同的,所有它可以通过下标来访问数组的各项            但结构并不是由他成员构成的数组,它的每一项成员的数据成都可能都不同,所以无法通过下标来访问            而结构变量在表达式时,也不会转换为一个指针     */     ////结构体的申明    /////结构体申明的模板 struct tag{member-list} variable-list;    struct{        int a;        char b;        float c;     } x;    //上面声明了一个结构体,并申明了一个x的变量 ,它包含三项a,b,c     x.a = 10;    printf("%d\n",x.a);    struct{        int a;        char b;        float c;    }y[20],*z;    ////上面申明了y和z,y是一个数组,它包含20个结构体,z指向了这个类型的结构体    /////上面是直接申明结构体和指向结构体的变量     /////需要重点注意的是虽然上面两个结构体内部申明都是a,b,c类型也完全相同,但是在编译器看来是两种截然不同的类型    ////所以 z = &x是非法的     ////由上面结构体申明的模板可以知道,还有一个tag    ////tag的作用就是讲一个变量和结构体列表联系在一起    struct typeStruct{        int a;        char b;        float c;    };     struct typeStruct t1;    struct typeStruct *t2;    ////此时t1,t2是相同类型的结构体    t1.a = 100;    t1.b = 's' ;    t1.c = 23.23;    printf("%d , %c , %f\n",t1.a,t1.b,t1.c);    ////还有一种申明结构体的方式    typedef struct{        int a;        char b;        float c;    }simpleType;    /////这里的simpleType是结构体类的名称,并不是结构体的一个变量    ////申明一个结构的方式便变为     simpleType type1;    simpleType type2;    type1.a = 300;    type1.b = 'd';    printf("%d , %c\n",type1.a,type1.b);    /////结构体中的成员变量还可以是其他结构体的成员    struct TEST{        int a;        simpleType type;    };     struct TEST test1;    test1.a  = 400;    test1.type = type1;    printf("%d %d %c\n",test1.a,test1.type.a,test1.type.b);//  //  ////结构体成员的访问//  struct TEST *cp;    ////由于.操作符高于间接操作符,而*是一个间接操作符 但是好像还是有问题,在dev c++中无法执行     //////所以最好对于指向结构体的指针访问成员变量的时候,还是用->//  printf("sssssss-- %d \n",testp->a);//  struct Ts{//      int a;//      float b;//  };//  struct Ts *t;//  (t) -> a = 100;////使用->不知道为什么老是蹦     /////结构体的成员可以是自己本身类型的结构体成员    struct ourselfStruct{        int a;        struct ourselfStruct *ourself;////这里必须是指针,否则不合法     };     struct ourselfStruct os1;    struct ourselfStruct os2;    os1.a = 500;    os2.a = 600;    os1.ourself = &os2;    printf("结构体引用自身%d , %d\n",os1.a,os1.ourself->a);////这里不知道为什么使用->函数又不报错     /////结构体的初始化,结构体的初始化和数组类似,都是用一对{}    struct Ty{        int a;        char b;    }xx={10,'c'};     printf("%d %c\n",xx.a,xx.b);    ////结构体使用malloc分配内存    typedef struct mem{        int a;        int b;    }Mems;     Mems *me = (Mems*)malloc(sizeof(Mems));    (*me).a = 700;    (*me).b = 800;    printf("%d %d\n",(*me).a,(*me).b);    /*        在为结构体分配内存时,运行时系统不会自动为结构体内部的指针分        配内存。类似地,当结构体消失时,运行时系统也不会自动释放结构        体内部的指针指向的内存。     */ 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

/* ============================================================================ Name        : De.c Author      : caoxuekun Version     : Copyright   : Your copyright notice Description : Hello World in C, Ansi-style ============================================================================ */#include <stdio.h>#include <stdlib.h>#define LIST_SIZE 10typedef struct{    int a;    char *p;}Person;////释放掉结构体中的内部指针void deallocatePerson(Person *person){    free(person->p);}Person *list[LIST_SIZE];/////初始化结构体数组,将其都置为NULLvoid initializeList(){    int i = 0;    for(;i<LIST_SIZE;i++){        list[i] = NULL;    }}////获取结构体Person* getPerson(){    int i = 0;    ////遍历结构体数组,找到为NULL的项,返回对应的指针,否则创建一个结构体    for(;i<LIST_SIZE;i++){        if(list[i] !=NULL){            Person *ptr = list[i];            list[i] = NULL;            return ptr;        }    }    Person *person = (Person*)malloc(sizeof(Person));    return person;}////将某一个Person结构体放入数组当中Person* returnPerson(Person *person){    int i = 0;    for(;i<LIST_SIZE;i++){        if(list[i] == NULL){            list[i] = person;            return person;        }    }    ////数组满了,利用deallocateperson释放掉person结构体中的内部指针    deallocatePerson(person);    ////并释放掉person    free(person);    return NULL;}/////为结构体的每一项赋值void initializePerson(Person *ptr,int a,char *p){    ptr->a = a;    ptr->p = p;}///展示结构体Person的每一项数据int main(void){    ////初始化    initializeList();    Person *ptrPerson;    ptrPerson = getPerson();    ////初始化ptrPerson    initializePerson(ptrPerson,100,"aaaa");    printf("%d , %s\n",ptrPerson->a,ptrPerson->p);    return EXIT_SUCCESS;}
原创粉丝点击