前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之结构体和共用体、typedef 指令

C++之结构体和共用体、typedef 指令

作者头像
包子388321
发布2020-06-16 18:59:30
7550
发布2020-06-16 18:59:30
举报
文章被收录于专栏:包子的书架包子的书架

struct 结构体

  • 概念:是允许用户自定义的可用的数据类型,它允许开发者存储不同类型的数据项。 语法构造:必须使用struct关键字开头定义
代码语言:c++
复制
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
  • 结构体定义和初始化
  • 正常的定义
代码语言:c++
复制
struct Student {
char  name[20];
int age;
}Lucy = { "lucy", 20 };  全局的变量

int main() {
    方法内的定义,调用和初始化
    Student stu = { "jason", 18 };
    printf("name: %s, age %d \n", stu.name, stu.age);

   struct Student stu2;
   strcpy(stu2.name, "123");
   stu2.age = 20;
   printf("stu2.name = %s, stu2.age= %d \n", stu2.name, stu2.age);

   system("pause");
   return 0;
}
  1. 匿名定义 锁定结构体的变量的数量, 匿名结构体
代码语言:c++
复制
struct{
  char name[20];
  int age;
  int classId;
}stu3,stu4,stu5;  
  • 结构体数组 结构体数组的使用和结构体指针的使用 例子一:
代码语言:c++
复制
struct Student {
    char * name;
    int age;
    
}Lucy = { "lucy", 20 };

int main() {
    int i;
    struct Student stu[3] = { {"lucy", 20 }, { "lilei", 32 }, { "Hanmeimei", 35 } };
    printf("stu address: %#x\n", stu);
    struct Student s[5];
    for (i = 0; i < 5; i++) {
        s[i].age = 20 + i;
        //strcpy(s[i].name, "lucy");  //数组不能直接赋值
        s[i].name = "lucy";  //如果name是指针,可以直接赋值
    }

    for (i = 0; i < 5; i++)
    {
        printf("s %d: %s, %d\n", i, s[i].name, s[i].age);
    }
    int b = 20;
    int * a = &b;
    struct Student *stud = stu;
    struct Student *stud;
    stud = (Student *)malloc(sizeof(struct Student) * 4);
    printf("%#x\n", stud);
    memset(stud, 0, sizeof(struct Student) * 4); //将当前内存块的内容全部初始化位0 

    for (i = 0; i < 4; i++) {
        /*(stud + i)->age = 20 + i;
        (stud + i)->name = "lucy";*/

        stud[i].age = 20 + i;
        stud[i].name = "lucy";

    }
    for (i = 0; i < 4; i++)
    {
        printf("stud %d: %s, %d\n", i, (stud +i)->name, (stud + i)->age);
    }
    //system("pause");
    
    return 0;
}

memset的方法:https://cloud.tencent.com/developer/article/1646115

  • 在结构体里面添加函数指针成员变量
代码语言:c++
复制
struct Man {
    int age;
    char *name;
    int(*Msg)(char *, int);
};

int message(char * str, int age) {
    MessageBox(0, TEXT("hello"), TEXT("Lijian"), 0);
    return 0;
}

int main() {
    struct Man man;
    man.age = 40;
    man.name = "李建";
    man.Msg = message;
    man.Msg(man.name, man.age);
    system("pause");
    return 0;
}
  • 结构体中添加结构体指针成员变量 单链表为例:
代码语言:c++
复制
struct Node {
    int data;
    Node *next;
};

//单链表结构
int enqueNode(Node *head, int data) {
    //创建最新节点
    Node * node = (Node *)malloc(sizeof(Node));
    if (node == NULL) {
        return 0;
    }
    //最新节点存放数据
    node->data = data; 
    node->next = NULL;

    Node *p = head; //创建一个指针指向head的第一个节点,然后由这个指针进行链表的索引遍历
    while(p->next != NULL) {
        p = p->next;
    }

    p->next = node; //结束点
    while (head->next != NULL) {
    head++;//移动到当前的最新的节点
    }
        return 1;
    }

int main() {
    int num = 10;
    int i = 0;
    Node * list;
    list = (Node *)malloc(sizeof(struct Node));
    list->data = 0;
    list->next = NULL;

    for (i = 0; i < num; i++) {
        enqueNode(list, i+1);
    }

    while (list->next != NULL)
    {
        printf("%d \n", list->data);
        list = list->next;
    }

    system("pause");
    return 0;
}

双向链表:

在某个节点插入的结构图.
在某个节点插入的结构图.

代码语言:c++
复制
struct DoubleLink {
    int value;
    DoubleLink *pre;
    DoubleLink *next;
};


int insertNode(DoubleLink *head, int index, int value) {
    DoubleLink *node = (DoubleLink *)malloc(sizeof(DoubleLink));
    if (node == NULL) {
        return 0;
    }
    node->value = value;
    node->next = NULL;
    node->pre = NULL;
    //创建一个索引指针,指向head位置
    DoubleLink *p = head;
    //链表当前的数量
    int length = 1;
    while (p ->next != NULL)
    {
        p = p->next;
        length++;
    }
    if (index < 0 || index > length) {
        return 0;
    }
    if (length == index) {
        head->next = node;
        node->pre = head;
        node->next = NULL;
        return 0;
    }
    DoubleLink *p1 = head;
    int i;
    while (p1->next != NULL)
    {
        if(i = index)
        {
            //p1->next->pre = node;
            //p1->next = node;
            //node->next = p1->next;
            //node->pre = p1;
            p1 = p1->next; //先拿到插入前的下一个节点
            node->next = p1;
            node->pre = p1->pre;
            p1->pre->next = node;
            p1->pre = node;
            break;
        }
        else
        {
            p1 = p1->next;
            i++;
        }
    }
    return 0;
}

int deleteNode(DoubleLink *head, int index) {
    DoubleLink *p = head;
    //链表当前的数量
    int length = 1;
    while (p->next != NULL)
    {
        p = p->next;
        length++;
    }
    if (length == 1 || index < 0 || index >= length)
    {
        //表示空链表
        return 0;
    }
    else
    {
        DoubleLink *deletenode = head;
        for (int i = 0; i<index; i++)
        {
            deletenode = deletenode->next;
        }
        deletenode->pre->next = deletenode->next;
        deletenode->next->pre = deletenode->pre;
        delete deletenode;
    }

    return 0;
}

int main() {

    DoubleLink * LinkList;
    LinkList = (DoubleLink *)malloc(sizeof(struct DoubleLink));
    LinkList->value = 1;
    LinkList->next = NULL;
    LinkList->pre = NULL;

    insertNode(LinkList, 1, 1);
    insertNode(LinkList, 1, 2);
    insertNode(LinkList, 1, 3);
    insertNode(LinkList, 2, 4);

    deleteNode(LinkList, 3);

    while (LinkList->next != NULL)
    {
        printf("%d \n", LinkList->value);
        LinkList = LinkList->next;
    }

    system("pause");
    return 0;
}

共用体

共用体是表示:公用体内的所有变量的是公用一块内存的,当前内存是当中某个占用的最大内存。即,将不同的数据类型的数据放到同一段内存里面。

代码语言:c++
复制
union MyUnion
{
    int a;
    char b;
    float c;
};

int main() {
    MyUnion unio;
    
    unio.a = 10;
    unio.b = 'a';
    unio.c = 1.2f;
    printf("a: %#x, b: %#x, c: %#x\n", &unio.a, &unio.b, &unio.c);
    printf("a: %d, b: %c, c: %f\n", unio.a, unio.b, unio.c);

    system("pause");
    return 0;
}

typedef 指令

typedef 就是用来为复杂的声明定义简单的别名

类似java 代理

并没有创建新的数据类型,只是给现有类型创建了别名

代码语言:c++
复制
typedef int _in;
typedef char * string;

typedef int(*PFI)(char *, char *);

typedef Tnode * Treeptr;
typedef struct Tnode {
    char *word;
    int count;

    /*Tnode * left;
    Tnode * right;*/
    Treeptr left;
    Treeptr right;
} BinaryTreeNode;

int fun(char *, char *) {
    return 0;
}
int main() {
    _in a = 20;
    printf("%d\n", a);

    string str;
    str = "hello world";

    PFI fp;
    fp = fun;

    char * ch;
    ch = "hello world";

    BinaryTreeNode* node;
    node = (BinaryTreeNode *) malloc(sizeof(BinaryTreeNode));

    system("pause");
    return 0;
}

碰到的问题

vs215无法使用strcpy的问题:

https://www.cnblogs.com/dmego/p/6065144.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • struct 结构体
  • 共用体
  • typedef 指令
  • 碰到的问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档