我们在定义数据时,当需要定义多个变量时,可以将多个变量定义为一个结构体。结构体变量可以作为函数的形参。例如定义如下的结构体和函数:
#include <iostream>
struct stuVar1 {
char cName[30];
char cNumber[12];
};
struct stuVar2 {
int nCount;
char cSubJectName[50];
stuVar1 stu;
};
struct stuVar3 {
int nCount;
char cSubJectName[50];
char cName[30];
char cNumber[12];
};
void function1(stuVar2* stuSrc, stuVar3* stuDest) {
strncpy_s(stuDest->cName, stuSrc->stu.cName,29);
strncpy_s(stuDest->cNumber, stuSrc->stu.cNumber, 11);
strncpy_s(stuDest->cSubJectName, stuSrc->cSubJectName,49);
stuDest->nCount = stuSrc->nCount;
}
int main()
{
std::cout << "Hello World!\n";
stuVar1 stu1 = {sizeof(stuVar1),0}; //结构体初始化
const char* pName = "XiaoWang";
strncpy_s(stu1.cName, pName, sizeof(stu1.cName)-1);
const char* pNumber = "13235678967";
strncpy_s(stu1.cNumber, pNumber, sizeof(stu1.cNumber) - 1);
stuVar2 stu2 = { sizeof(stuVar2),0 };
stu2.nCount = 2;
const char* pSubject = "Physical";
strncpy_s(stu2.cSubJectName, pSubject, sizeof(stu2.cSubJectName) - 1);
stu2.stu = stu1;
stuVar3 stu3 = {sizeof(stuVar3),0};
function1(&stu2, &stu3);
}
结构体的初始化方法有:
(1)stuVar2 stu2 = { sizeof(stuVar2),0 }; //上面代码结构体初始化使用
也可以省略0,直接stuVar2 stu2 = { sizeof(stuVar2) }; //int初始值不为0
上面函数运行的结果如下:
结构体的初始化方法还有下面几种 :
//方法(2) 初始值为0, 为""
stuVar2 stu2 = {0 };
//方法(3)初始值为0
stuVar3 stu3; ::memset(&stu3,0,sizeof(stuVar3)); )
//方法(4)定义时,直接使用构造函数初始化
typedef struct tagVAR_INFO {
int nCount;
char cSubJectName[50];
tagVAR_INFO (){
nCount = 0;
::memset(&cSubJectName,0,sizeof(cSubJectName));
}
}VAR_INFO;
上面的代码中使用strncpy_s函数对结构体中的char数组变量进行了复值。在结构体中尽量使用char数组,少用char*;因为char*指向的一块地址,而数组是包括地址和内容的,关于char数组和char*的问题可参考char *和char数组的区别(深拷贝和浅拷贝的观点)以及内核访问用户空间 - OSCHINA - 中文开源技术交流社区