三种:
1按字符赋值。
如结构体变量为a,成员为字符数组s[10];那么可以
for(i=0;i10;i++)
a.s[i]=xxx;
xxx可以是任意字符。比如getchar(),即从终端读取。
2用strcpy赋值。
如
strcpy(a.s,"test");
就是将字符数组赋值为"test"。
3用memcpy赋值。
如
memcpy(a.s,"test2",3);
就是将a.s的前三个字符赋值成't','e','s'。
请说明结构体初始化数据赋值的几种方式结构体能自由组装数据,是一种很常见的数据打包方法。当我们定义一个结构体后,没有初始化就使用,就会使用到垃圾数据,而且这种错误很难发现。对于定义的任何变量,我们最好都先初始化。
除了使用memset和ZeroMemory之外,有没有更简单的方法初始化呢?因为有时候每定义一个结构体,就使用一次memset,也会觉得很繁琐。
我这里总结三种方法,如果大家有什么好的方法,不妨加上去。
1、结构体的构造函数中初始化。
2、继承模板类初始化
3、定义时初始化
在C++中,结构体与类在使用上已没有本质上的区别了,所以可以使用构造函数来初始化。如下代码所示:
structStu
{
intnNum;
boolbSex;
charszName[20];
charszEmail[100];
//构造函数初始化
Stu()
{
nNum=0;
bSex=false;
memset(szName,0,sizeof(szName));
memset(szEmail,0,sizeof(szEmail));
}
};
你可能已经发现了,如果结构体中有大量成员,一个个赋值,相当麻烦。那么你可以这样写:
structStu
{
intnNum;
boolbSex;
charszName[20];
charszEmail[100];
//构造函数初始化
Stu()
{
memset(this,0,sizeof(Stu));
//或者是下面的格式
//memset(nNum,0,sizeof(Stu));
}
};
如果在结构体中分配了指针,并且指针指向一个堆内存,那么就在析构函数中释放。以上便是在构造函数中初始化。
2、继承模板类初始化
首先定义一个模板基类:
templatetypenameT
classZeroStruct
{
public:
ZeroStruct()
{
memset(this,0,sizeof(T));
}
};
之后定义的结构体都继承于此模板类。
structStu:ZeroStructStu
{
intnNum;
boolbSex;
charszName[20];
charszEmail[100];
};
这样也能实现初始化。
3、定义时初始化。
structStu
{
intnNum;
boolbSex;
charszName[20];
charszEmail[100];
};
//定义时初始化
Stustu1={0};
在有的结构体中,第一个成员表示结构体的大小,那么就可以这样初始化:
structStu
{
intnSize;//结构体大小
intnNum;
boolbSex;
charszName[20];
charszEmail[100];
};
Stustu1={sizeof(Stu),0};
后面的0,可以省略掉,直接写成:Stustu1={sizeof(Stu)};后面自动会用0填充。
总结分析:
以上三种,是据我所知的初始化结构体方法。
前面两种,实际上已经把结构体给类化了,和类的使用差不多。第三种,是纯粹的结构体的写法。
如果用途仅仅限定为结构体,我建议不要加上构造函数,也不要继承于那个模板类,因为这个时候结构体实际上已经是类了。在定义结构体时,将无法使用第三种方式去初始化,当然,此时也不需要初始化了。
看看微软定义的结构体,基本上都没有构造函数和析构函数。因为结构体的意义很明确,它仅仅是对数据的一个包装,如果加上了方法,其意义就变了。
自己的总结:
关于第三种初始化方法,类似于数组的初始化。
结构体变量如何赋值可以直接赋值吗结构体变量是可以直接赋值的;
定义结构体类型,然后用这个类型定义出来的变量就是结构体变量;
C语言在相同类型的变量间赋值时是直接内存复制的,即将他们的内存进行复制,这里因为同样结构体变量,属于同一种变量,所以赋值时是按照他们的内存分布来直接拷贝的。
logo设计
创造品牌价值
¥500元起
APP开发
量身定制,源码交付
¥2000元起
商标注册
一个好品牌从商标开始
¥1480元起
公司注册
注册公司全程代办
¥0元起
查
看
更
多