c语言结构体可以等号赋值吗_c语言结构体可以通过等号复制么?

#include <stdio.h>

#include <stdlib.h>

struct test

{

int a[5];

};

void print_test(struct test* a, const char* msg)

{

int i;

printf("%s:\t", msg);

for (i = 0; i < 5; ++i)

printf("%d ", a->a[i]);

printf("\n");

}

void reset(struct test* input, int start)

{

int i;

struct test tmp;

for (i = 0; i < 5; ++i)

tmp.a[i] = start + i;

*input = tmp;

}

int main()

{

struct test r1, r2, r3;

int i;

for (i = 0; i < 5; ++i) {

r1.a[i] = i;

r2.a[i] = i + 20;

r3.a[i] = i + 40;

}

print_test(&r1, "r1");

print_test(&r2, "r2");

print_test(&r3, "r3");

r1 = r2;

r2 = r3;

reset(&r3, 80);

print_test(&r1, "r1");

print_test(&r2, "r2");

print_test(&r3, "r3");

return(0);

}

我以前一直以为结构体复制需要用memcpy这种东西,今天才知道可以直接用=号,求教一下各位。

C语言

C语言中,结构体是一篇连续的内存空间,使用=赋值操作,底层用到的就是memcpy;

如果结构体中有指针变量;操作后。两个指针指向的同一块区域,而不会分配新的区域;

struct S

{

int a;

char * b;

};

int main(){

S s1;

s1.b = new char[5];

memcpy(s1.b,"hell",5);

S s2;

s2 = s1;

printf("s1.b:%s ,%d \n s2.b:%s,%d\n" ,s1.b,int(s1.b),s2.b,int(s2.b));

return 0;

}

output://复制后的地址空间相同

s1.b:hell ,4921176

s2.b:hell,4921176

C++

在C++中,struct和class的作用相同,都是用于定义类,区别仅仅在于结构体内默认访问权限是public,而class定义的private;

而定义类的时候,c++编译器会为每个类自动加上默认构造函数、拷贝构造函数、以及赋值操作函数oprerator=

而通过=号操作时,

a = b;

既:

a.operator=(b);

operator=()函数内的实现细节为:对于基本类型,直接拷贝;对于自定义类型,调用拷贝构造函数拷贝;

结构体不是指针,所以可以直接赋值,而数组是指针,所以不行,我是这样认为的

结构体是一坨一坨的,赋值的时候是整坨赋过去的(底层也是memcoy)

直接用等于的话,太耗内存了,结构体指针更好一点吧。


版权声明:本文为weixin_40003478原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。