zoukankan      html  css  js  c++  java
  • 结构体的赋值

    结构体的赋值

           1.指针的赋值

             区分对指针本身赋值对指针指向的空间进行赋值

           2.数组的赋值

             不能对数组名进行赋值,对数组的赋值实质上是数组中元素一个一个的拷贝。

           3.结构体的赋值

             结构体中的指针

             结构体中含有指针时,对结构体赋值类似于指针的赋值,只是浅赋值,如果想深赋值,还需要额外处理。

             结构体中的数组

             结构体含有数组时,对结构体进行赋值,可以实现数组的直接赋值,而外部的数组不能进行直接赋值,而是一个一个的拷贝。

             结构体的直接赋值,实质上是对结构体的完全拷贝,不管结构体中有指针还是数组,拷贝的内容都是结构体本身,也就是说结构体中有指针时,拷贝的是指针本身;结构体中有数组时,拷贝的是数组。

             对结构体赋值,可以将结构体内部中的数组进行直接赋值。而直接的数组不能实现数组间的赋值操作。

             测试代码和注释:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct st1
    {
        char* p; // 指针
    };
    
    void print_st1(struct st1* ps)
    {
        printf("%s
    ", ps->p);
    }
    
    struct st2
    {
        char a[5]; // 数组
    };
    
    void print_st2(struct st2* ps)
    {
        printf("%s
    ", ps->a);
    }
    
    int main()
    {
        // 指针的赋值
        char  p[] = "abc";
        char* q   = p; // 对指针赋值
    
        printf("%s
    ", p);
        printf("%s
    ", q);
        printf("
    ");
    
        strcpy(p, "xyz");
    
        printf("%s
    ", p);
        printf("%s
    ", q);
        printf("
    ");
    
        // 分配空间
        q = (char*)malloc(strlen(p) + 1);
        strcpy(q, "abc");
        printf("%s
    ", p);
        printf("%s
    ", q);
        printf("
    ");
    
        free(q);
    
        // 数组的赋值
        int a[3] = {1, 2, 3};
        // int b[3] = a; // 对数组这种初始化失败
        int b[3];
        // b = a; // 赋值失败,因为不存在对数组的赋值,b是数组名,是一个常量
    
        // 拷贝a中的元素到b中
        int i = 0;
        for (i = 0; i < sizeof (a) / sizeof (*a) && sizeof (b) >= sizeof(a); ++i)
        {
            b[i] = a[i]; // 一个一个拷贝
        }
    
        for (i = 0; i < sizeof (b) / sizeof (*b); ++i)
        {
            printf("%d ", b[i]);
        }
        printf("
    ");
        printf("
    ");
    
        
        // 结构体的赋值
        // 结构体中的指针
        struct st1 s1;
        s1.p = (char*)malloc(5);
        strcpy(s1.p, "abc");
    
        struct st1 s2;
        s2 = s1; // 结构体的赋值,结构体中的指针
    
        printf("%s
    ", s1.p);
        printf("%s
    ", s2.p);
        printf("
    ");
    
        strcpy(s1.p, "xyz");
        printf("%s
    ", s1.p);
        printf("%s
    ", s2.p);
        printf("
    ");
    
        strcpy(s1.p, "abc");
        s2.p = (char*)malloc(5);
        strcpy(s2.p, s1.p);
        printf("%s
    ", s1.p);
        printf("%s
    ", s2.p);
        printf("
    ");
    
        strcpy(s2.p, "xyz");
        printf("%s
    ", s1.p);
        printf("%s
    ", s2.p);
        printf("
    ");
    
        free(s1.p);
        free(s2.p);
    
        printf("%d
    ", (int)s1.p);
        printf("%d
    ", (int)s2.p);
        printf("
    ");
        s1.p = NULL;
        s2.p = NULL;
        printf("%d
    ", (int)s1.p);
        printf("%d
    ", (int)s2.p);
        printf("
    ");
    
        // 结构体的赋值
        // 结构体中的数组
        struct st2 t1;
        strcpy(t1.a, "abc"); // 不能对数组进行直接赋值,所以只能逐个拷贝
    
        struct st2 t2;
        t2 = t1; // 结构体的赋值,结构体中的数组
                 // 结构体中有数组,如果对结构体进行赋值,那么其里面的数组也被拷贝,可以看做是数组的赋值
                 // 但是对于外部的数组直接赋值是不可以的
    
        printf("%s
    ", t1.a);
        printf("%s
    ", t2.a);
        printf("
    ");
    
        strcpy(t1.a, "xyz");
        printf("%s
    ", t1.a);
        printf("%s
    ", t2.a);
        printf("
    ");
    
        strcpy(t1.a, "abc");
        strcpy(t2.a, "xyz");
        printf("%s
    ", t1.a);
        printf("%s
    ", t2.a);
        printf("
    ");
    
        return 0;
    }

  • 相关阅读:
    jQuery UI DatePicker用法和中文设置
    jQuery的ajax方法
    jQuery遍历复杂的JSON数据
    JavaScript面向对象的写法
    jpa
    日志
    全局异常的处理!
    oracle表空间
    plsql的连接配置
    pLsql使用
  • 原文地址:https://www.cnblogs.com/unixfy/p/3489627.html
Copyright © 2011-2022 走看看