自学内容网 自学内容网

C语言之结构体

结构体

作用:

        结构体是一种构造类型的数据结构

        是一种或多种基本类型或构造类型的数据的集合

        可自定义

定义:

        1,一般定义方式

                struct 结构体名称

                {

                        //定义变量

                };

        2,定义结构体时顺带创建一个结构体变量

                struct 结构体名称

                {

                        //定义变量

                }结构体变量名;

        3,给结构体起别名

                typedef struct 结构体变量名

                {

                        //定义变量

                }别名;

创建结构体变量

语法1:

        struct 结构体名称 结构体变量={值1,值2,值3...};

        struct 结构体名称 结构体变量;

语法2:

        别名 结构体变量={值1,值2,值3...};

        别名 结构体变量;

注意:

        结构体对象清0

                memset(&结构体变量名,0,sizeof(struct 结构体名称));

        结构体初始化必须按照成员顺序和成员自身类型

结构体变量使用结构体的成员变量

存值:

        结构体变量.成员变量名=值;

        注意:

                字符串的成员变量需要使用strcpy实现深拷贝

        ps:在 C 语言中,字符串通常是以字符数组的形式存储的。当结构体中有一个字符数组类型的成员变量用来存储字符串时,如果直接使用赋值语句,如结构体变量.字符串成员变量 = "新字符串";,实际上是将一个指针指向了一个字符串常量,这就类似于浅拷贝,多个结构体变量的字符串成员可能会指向同一块内存中的字符串常量。

取值:

        结构体变量.成员变量名

特殊结构体:匿名结构体

特点:只能创建一个结构体变量

语法:

        struct{

            成员变量            

        }结构体变量名;

没有结构体变量名

如:

#include <stdio.h>
#include <string.h>
struct
{
        int age;
        char color[30];
}ql;
int main(int argc, char const *argv[])
{
        ql.age = 8000;
        strcpy(ql.color,"黑");
        printf("年龄:%d\t颜色:%s\n",ql.age,ql.color);
        return 0;
}

整体赋值

结构体变量名1 = 结构体变量名2;

        将结构体变量2的成员的值逐一赋给结构体变量1的成员

memcpy函数

作用:

        拷贝内存中的内容

头文件:

   <string.h><memory.h>

语法:

   void *memcpy(void *dest,const void*src,size_t n);

参数:

        dest:目标地址

        src:资源地址

        n:长度

strcpy与memcpy的区别

功能

memcpy:按字节复制任意类型数据,从源内存地址复制指定字节数到目标内存地址。

strcpy:专门用于字符串复制,将源字符串复制到目标字符串,直至遇到源字符串的\0,并在目标字符串末尾添加\0

参数

memcpy:有三个参数,目标内存地址、源内存地址、要复制的字节数。

strcpy:有两个参数,目标字符串地址和源字符串地址。

复制方式

memcpy:按指定字节数严格复制,不考虑数据类型和\0字符。

strcpy:以字符为单位,遇\0停止复制,并添加\0到目标字符串。

返回值

memcpy:返回目标内存地址。

strcpy:返回目标字符串地址。

计算结构体大小

对齐方式默认按照结构体中最大成员类型的大小进行对齐。

对于数组和结构体成员,将它们拆分成所存储的数据大小来计算。

如:

        struct Stu{
                short x;//4
                int a;//4
                char c;//4
                char str[50];
        };

ps:类型为char数组,大小为 50 字节。它会从偏移量为 12 的位置开始存储,由于 50 除以 4 等于 12 余 2,所以需要向上取整为 13 个 4 字节单元,即占用 52 字节。

4 + 4 + 4 + 52 = 64 字节,所以结构体Stu的大小为 64 字节。


可以使用以下代码进行测试:

#include <stdio.h>

struct Stu {
    short x;
    int a;
    char c;
    char str[50];
};

int main() {
    printf("结构体Stu的大小为:%lu字节\n", sizeof(struct Stu));
    return 0;
}

成员变量如果是结构体,那么这个结构体所占据的大小也是参与计算对齐单元大小的依据。

强制对齐

作用:

        默认的结构体的对齐方式是由其中最大的成员进行对齐的

        使用强制对齐就会使用强制的大小进行对齐

语法:

        #pragma pack (value)时的指定对齐值value为1 2 4 8等

ps:

   char:可指定 1、2、4、8 等,默认 1 字节对齐。

   short:可指定 1、2、4、8 等,默认 2 字节对齐。

   intfloat:可指定 1、2、4、8 等,默认 4 字节对齐。

   double:可指定 1、2、4、8 等,默认 8 字节对齐。

           指针类型:可指定 1、2、4、8 等,对齐与机器字长相关(32 位 4 字节、64 位 8 字节常见)。

结构体中定义结构体变量

结构体 A 中的成员变量是结构体 B 的结构体变量

结构体指针

概念:

        指向结构体变量的指针

语法:

        结构体名称 *指针变量名=&结构体变量;

操作成员变量:

        指针变量名->成员变量名

        指针变量名->成员变量名=值;

注意:

        字符数组型需要使用strcpy

指针作为结构体成员

#include <stdio.h>
#include <stdlib.h>

// 结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;

int main() {
    Node n1, n2;
    n1.data = 5;
    n1.next = &n2;
    n2.data = 10;
    n2.next = NULL;
    printf("n1数据: %d, 下一个节点数据: %d\n", n1.data, n1.next->data);
    return 0;
}

数组存储结构体变量

#include <stdio.h>

// 结构体
typedef struct {
    int id;
} Student;

int main() {
    Student students[2];
    students[0].id = 1;
    students[1].id = 2;
    printf("第一个学生id: %d, 第二个学生id: %d\n", students[0].id, students[1].id);
    return 0;
}


原文地址:https://blog.csdn.net/m0_75253775/article/details/143770696

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!