C 结构体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 结构体相关的知识,希望对你有一定的参考价值。

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

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

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

①:使用数组定义字符串

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

    结果:

技术分享

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

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


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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

结果:

技术分享

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 <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}

结果:

技术分享

解释:

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

其实 struct Monster godzilla  可以写为 M godzilla

本文出自 “Better_Power_Wisdom” 博客,请务必保留此出处http://aonaufly.blog.51cto.com/3554853/1918520

以上是关于C 结构体的主要内容,如果未能解决你的问题,请参考以下文章

分享几个实用的代码片段(第二弹)

分享几个实用的代码片段(第二弹)

如何优化C ++代码的以下片段 - 卷中的零交叉

Golang PrintfSprintf Fprintf 格式化

C 语言关于结构体做参数传递?

C 语言结构体 ( 结构体偏移量计算 | 代码示例 )