C语言中结构体

struct

1.结构体定义的时候不能赋初值;

struct ours{
    int num=100;   //编译报错
    int num;
    char str[100];
}

2.结构体中字符串赋值方式

void main(){
    struct ours o1={100,"hello china"};
    struct ours o2=01;    //结构体整体直接赋值的时候,即使字符串也可以直接赋值;
    o1.str=o2.str;        //错误,字符串不能直接赋值
    //字符串拷贝的方式
    sprintf(o1.str,02.str);
    strcpy(o1.str,o2.str);
}

3.结构体中定义结构体

3.1:第一种情况:在结构体中再次定义一个结构体,但是没有创建结构体的实例,再次定义结构体内部变量,会被当做母结构体成员变量
struct tianchao
{
    int data;
    char name[100];
    struct beijing {
        char str[100];
        int num;
    };
};

void main() {
    struct tianchao t1;
    t1.beijing;//报错,此时beijing只是一个类型,没有实体
    t1.data=100;
    t1.num=99;
    strcpy(t1.str,"goA");      
    printf("%s\n",t1.str);
}
3.2:结构体内部定义的结构体,创建结构体变量,那么该变量会直接作为一个成员;
    struct tianchao
{
    int data;
    char name[100];
    struct beijing {
        char str[100];
        int num;
    }b1;                       //内部定义的第一种方式
    struct beijing b2;         //内部定义的第二种方式
};

void main() {
    struct tianchao t1;
    t1.data = 1000;
    t1.b1.num = 99;
    sprintf(t1.name, "goA");
    sprintf(t1.b2.str, "goB2");
    sprintf(t1.b1.str, "goB1");
    printf("%s\n", t1.b2.str);     //goB2
    getchar();
}

4.匿名结构体

struct {
    char name[100];
    char phone[100];
    int num;
}

5.结构体数组

5.1结构体第一种定义方式
struct dangdang {
    char email[30];
    char name[30];
    char addr[100];
    int num;
    int bignum;
    char tel[20];
    char phone[20];
    double RMB;
};


void main(){

    struct dangdang dd[2];   //结构体数组第一种定义方式

}
5.2结构体定义第二种形式
struct dangdang {
    char email[30];
    char name[30];
    char addr[100];
    int num;
    int bignum;
    char tel[20];
    char phone[20];
    double RMB;
}dd[2];     //第二种方式
5.3结构体定义第三种形式
struct {
    char email[30];
    char name[30];
    char addr[100];
    int num;
    int bignum;
    char tel[20];
    char phone[20];
    double RMB;
}dd[2];     //第三种方式(匿名)

6.结构体数组初始化

结构体数组在内存中是连续存储的,挨个排列
<h4>6.1顺序初始化</h4>
struct dangdang {
    char email[30];
    char name[30];
    char addr[100];
    int num;
    int bignum;
    char tel[20];
    char phone[20];
    double RMB;
}dd[3]={
    {1,1.0,"1.0"},
    { 2,2.0,"2.0"},
    { 3,3.0,"3.0"}
},dd2[2]={
    {1,1.0,"1.0"},
    {2,2.0,"2.0"},
};     //整体初始化


struct dangdang {
    char email[30];
    char name[30];
    char addr[100];
    int num;
    int bignum;
    char tel[20];
    char phone[20];
    double RMB;
}dd[3]={
    1,1.0,"1.0",
    2,2.0,"2.0",
    3,3.0,"3.0"   //顺序初始化,省略一层大括号,但是必须一一对应匹配,否则报错
}

7.指针与结构体

struct mydata {
    int num;
    char str[100];
};

void main(){
    struct mydata md;
    struct mydata *p;
    md.num = 99;
    sprintf(md.str, "gogogo");
    p = &md;   //存放的是结构体变量在内存的起始地址,类型决定解析

    //printf("%d\n", sizeof(p));
    printf("%s\n", p->str);    //<====>(*p).str
    system("pause");
}

8.结构体指针作为函数参数

用结构体变量的成员作参数—–值传递(新建一个变量接收传递的值)
用指向结构体变量或者数组指针做参数—-地址传递
用结构体变量作参数—-多值传递

9.结构体字节对齐问题

结构体变量所占据的内存单元个数应该大于等于其内部的所有数据成员占据内存单元数目的和

出于效率考虑,C语言引入了字节对齐机制,一般有如下3条通用准则;
1.结构体变量大小能够被其最宽基本类型成员大小所整除;
2.结构体每个成员相对于结构体首地址的偏移量(offset)都是最宽基本成员大小的整数倍;如有需要编译器会在成员之间加上填充字节(internal  adding);
3.结构体总大小为结构体最宽基本类型成员大小的整数倍;如有需要编译器会在最末尾一个成员之间加上填充字节(trailing padding);

基本类型是指char short int float double等这样的内置数据类型,“数据宽度是指”其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型

struct info{
    int num;
}
    sizeof(struct info);//4

struct info{
    char c;
    int num;
}
    sizeof(struct info);//4

struct info{
    char c;    //1, 必须能被2整除,因此此时是2
    short sh;  //2   
    char ch[9];   //9     此时是10
}
    sizeof(struct info);//14
### C语言结构体赋值的方法或规则 在C语言中,结构体是一种用户自定义的数据类型,可以包含多种数据类型的成员。对于结构体的赋值操作,有以下几种常见的方式: #### 1. 初始化赋值 当定义一个结构体变量时,可以直接通过初始化列表为结构体的成员赋初值。这种方式要求在定义变量的同时进行赋值。 ```c struct Student { int age; float score; char sex; }; struct Student st = {80, 66.6, 'F'}; // 初始化赋值[^3] ``` #### 2. 成员逐一赋值 如果结构体变量已经定义但未初始化,可以通过逐一访问其成员来赋值。 ```c struct Student st2; st2.age = 10; // 成员逐一赋值 st2.score = 88; st2.sex = 'F'; ``` #### 3. 整体赋值 C语言允许直接将一个结构体变量的整体赋值给另一个同类型的结构体变量。这种赋值方式会将源结构体的所有成员值复制到目标结构体中。 ```c struct Student st = {80, 66.6, 'F'}; struct Student st2; st2 = st; // 整体赋值[^3] ``` #### 4. 使用函数返回结构体 可以通过函数返回一个结构体,从而实现对结构体变量的赋值。 ```c struct s_tag twofold(struct s_tag s) { for(int i = 0; i < 100; i++) { s.a[i] *= 2; } return s; // 函数返回结构体 } int main() { struct s_tag lime, lemon; for(int i = 0; i < 100; i++) { lime.a[i] = 1; } lemon = twofold(lime); // 使用函数返回值进行赋值[^2] return 0; } ``` #### 5. 借助指针赋值 通过结构体指针可以间接对结构体变量的成员进行赋值。 ```c struct Student { int age; float score; char sex; }; struct Student st; struct Student *p = &st; p->age = 10; // 指针赋值 p->score = 88; p->sex = 'F'; ``` #### 注意事项 - 结构体赋值时,两个结构体必须是相同类型或兼容类型。 - 如果结构体中包含指针成员,则赋值后两个结构体会共享同一块内存地址,修改其中一个会影响另一个[^3]。 ### 示例代码 以下是一个综合示例,展示了几种结构体赋值的方式: ```c #include <stdio.h> struct Point { int x; int y; }; // 函数返回结构体 struct Point getPoint() { struct Point p = {10, 20}; return p; } int main() { struct Point p1 = {1, 2}; // 初始化赋值 struct Point p2; p2.x = 3; // 成员逐一赋值 p2.y = 4; p2 = p1; // 整体赋值 struct Point p3 = getPoint(); // 使用函数返回值赋值 printf("p1: (%d, %d)\n", p1.x, p1.y); printf("p2: (%d, %d)\n", p2.x, p2.y); printf("p3: (%d, %d)\n", p3.x, p3.y); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值