程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

结构体的赋值

结构体的赋值

       1.指针的赋值

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

 

       2.数组的赋值

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

 

       3.结构体的赋值

         结构体中的指针

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

 

         结构体中的数组

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

 

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

 

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

 

         测试代码和注释:

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

struct st1
{
    char* p; // 指针
};

void print_st1(struct st1* ps)
{
    printf("%s\n", ps->p);
}

struct st2
{
    char a[5]; // 数组
};

void print_st2(struct st2* ps)
{
    printf("%s\n", ps->a);
}

int main()
{
    // 指针的赋值
    char  p[] = "abc";
    char* q   = p; // 对指针赋值

    printf("%s\n", p);
    printf("%s\n", q);
    printf("\n");

    strcpy(p, "xyz");

    printf("%s\n", p);
    printf("%s\n", q);
    printf("\n");

    // 分配空间
    q = (char*)malloc(strlen(p) + 1);
    strcpy(q, "abc");
    printf("%s\n", p);
    printf("%s\n", q);
    printf("\n");

    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("\n");
    printf("\n");

    
    // 结构体的赋值
    // 结构体中的指针
    struct st1 s1;
    s1.p = (char*)malloc(5);
    strcpy(s1.p, "abc");

    struct st1 s2;
    s2 = s1; // 结构体的赋值,结构体中的指针

    printf("%s\n", s1.p);
    printf("%s\n", s2.p);
    printf("\n");

    strcpy(s1.p, "xyz");
    printf("%s\n", s1.p);
    printf("%s\n", s2.p);
    printf("\n");

    strcpy(s1.p, "abc");
    s2.p = (char*)malloc(5);
    strcpy(s2.p, s1.p);
    printf("%s\n", s1.p);
    printf("%s\n", s2.p);
    printf("\n");

    strcpy(s2.p, "xyz");
    printf("%s\n", s1.p);
    printf("%s\n", s2.p);
    printf("\n");

    free(s1.p);
    free(s2.p);

    printf("%d\n", (int)s1.p);
    printf("%d\n", (int)s2.p);
    printf("\n");
    s1.p = NULL;
    s2.p = NULL;
    printf("%d\n", (int)s1.p);
    printf("%d\n", (int)s2.p);
    printf("\n");

    // 结构体的赋值
    // 结构体中的数组
    struct st2 t1;
    strcpy(t1.a, "abc"); // 不能对数组进行直接赋值,所以只能逐个拷贝

    struct st2 t2;
    t2 = t1; // 结构体的赋值,结构体中的数组
             // 结构体中有数组,如果对结构体进行赋值,那么其里面的数组也被拷贝,可以看做是数组的赋值
             // 但是对于外部的数组直接赋值是不可以的

    printf("%s\n", t1.a);
    printf("%s\n", t2.a);
    printf("\n");

    strcpy(t1.a, "xyz");
    printf("%s\n", t1.a);
    printf("%s\n", t2.a);
    printf("\n");

    strcpy(t1.a, "abc");
    strcpy(t2.a, "xyz");
    printf("%s\n", t1.a);
    printf("%s\n", t2.a);
    printf("\n");

    return 0;
}

posted on 2013-12-24 20:22  unixfy  阅读(9295)  评论(0编辑  收藏  举报

导航