在C中结构体可以理解为与C#中的结构提一样是值类型。所以要进行传址应用的话,需要使用*(指针)的知识。这是本篇的重点。但是,现在由浅入深,废话少说,Go!!!!!!!!

一,关于结构体的申明及使用:

总的 : 结构体放在main的前面 , 它的类型是 struct structname(自己定义的机构体名)

①:使用数组定义字符串

#include 
#include 
#include 
struct Monster
{
    int id;
    char name[50];
    int level;
    int skill;
    char desc[50];
};
int main()
{
    struct Monster godzilla;
    godzilla.id = 1;
    strcpy(godzilla.name,"哥斯拉");//因为使用数组的方式(相当于已经定义了一个字符串了 , 和高级的不一样 , 麻烦 : 这点注意),所以这里面应该使用copy的方式 , 而不能使用 ="" 或者 {'',''}
    godzilla.level = 1;
    godzilla.skill = 0;
    strcpy(godzilla.desc,"强力撕咬");
    printf("..........................................\n");
    printf("怪物的名字 : %s\n" , godzilla.name);
    printf("..........................................\n");
    //还可以这样复制
    struct Monster godzilla1 = {2,"S2",.desc="AAAAAA"};
    printf("怪物的名字 : %s\n" , godzilla1.desc);
    return 0;
}

    结果:

C 结构体_第1张图片

1,char name[50] 相当与=于已经定义了一个字符串(字符串存在),所以不能再使用 =“abc” 或者 {‘a’, 'b' , 'c' , '\0'}给它已经初始化的赋值了

2,struct Monster godzilla1 = {2,"S2",.desc="AAAAAA"}; 这个方式类似与C#的赋值方法 , 可以按照顺序来,当要特定为某一成员赋值时 : 使用.+成员名来获得成员


② :使用*(指针)定义字符串

#include 
#include 
#include 
struct Monster
{
    int id;
    char * name;
};
int main()
{
    struct Monster godzilla;
    godzilla.id = 0;
    godzilla.name = calloc(20,sizeof(char));
    printf("请输入怪物的名字 :");
    scanf("%s",godzilla.name);
    //godzilla.name = "哥斯拉";
    printf("怪物的名字 %s\n",godzilla.name);
    return 0;
}

结果:

C 结构体_第2张图片

1,使用 char * name来定义字符串动态录入时,因为字符串没有内存,所以赋值是必须使用malloc或者calloc来动态的获取内存。使用比字符串数组要爽

静态的:

int main()
{
    struct Monster godzilla;
    godzilla.id = 0;
    //godzilla.name = calloc(20,sizeof(char));
    //printf("请输入怪物的名字 :");
    //scanf("%s",godzilla.name);
    godzilla.name = "哥斯拉";
    printf("怪物的名字 %s\n",godzilla.name);
    return 0;
}

2,缺陷,不使用后记得free掉*

3,任然可以使用 {2,"S2",.desc="AAAAAA"} 这种方式


重点 , 单纯传递结构体是传值,要传其地址(应用得使用*)

#include 
#include 
#include 
typedef struct Monster
{
    int id;
    char * name;
}M;//为结构重新命名M
void GetStruct( M * m);
void GetStruct( M *m)
{
    m->id = 2;
    m->name = "Aonaufly";
}
int main()
{
    struct Monster godzilla;
    godzilla.id = 0;
    //godzilla.name = calloc(20,sizeof(char));
    //printf("请输入怪物的名字 :");
    //scanf("%s",godzilla.name);
    godzilla.name = "哥斯拉";
    GetStruct(&godzilla);
    printf("怪物的名字 %s\n",godzilla.name);
    return 0;
}

结果:

C 结构体_第3张图片

解释:

typedef 即为类型 struct Monster 起一个名字 : M

其实 struct Monster godzilla  可以写为 M godzilla


补充:

C的结构体里面只能包含普通的数据类型 , 不能有函数 , 但是可以通过指针的方式解决 :

#include 
#include 
typedef struct _stu
{
    void (*p)();
}Stu;
void fun()
{
    printf("函数被调用");
}
int main(void)
{
    Stu s = { fun };
    s.p();
}