1.结构体变量(定义,初始化,作函数参数,作返回值)
(1)定义结构体变量
其中一种方法是利用typedef 定义:
(利用typedef)给结构体类型struct FUNCADATA定义别名:FuncaData
typedef struct FUNCADATA
{
int Num1;
char name1[20];
char sex;
}FuncaData;//FuncaData 相当于struct FUNCADATA的别名
(2)初始化结构体变量
//1.先定义再赋值
FuncaData Data1;
Data1.Num1 = 0;
Data1.sex = 'M';
strcpy(Data1.Name1, "lili");//error:Data1.name1 = "LILI";
//定义时初始化
FuncaData Data2 = {1, "lili", 'M'}; //2.完全初始化
FuncaData Data3 = {2}; //3.部分初始化
(3)结构体构造函数
typedef struct FUNCABDATA
{
int Num2;
char Name2[20];
char sex;
FUNCABDATA()
{
Num2 = 0;
strcpy(Name2, "lili");//error:name2 = "lili";
sex = 'M';
}
}FuncabData;
(4)结构体变量作函数参数,值传递
注:结构体值传递,函数内部修改不会改变原结构体
void SaveData1(FuncaData Data)
{
int n = Data.Num1;
char name[10];
strcpy(name, Data.Name1);
char sex = Data.sex;
// error:结构体值传递,函数内部修改不会改变原结构体
// Data.Num1 = 1;
// strcpy(Data.Name1, "lili2");
}
调用:
FuncaData Data1 = {0, "lili", 'M'};
SaveData1(Data1);
(5) 结构体变量作函数参数,指针传递
void SaveData2(FuncaData* Data)
{
Data->Num1 = 2;
strcpy(Data->Name1, "lili2");
Data->sex = 'M';
}
调用:
FuncaData Data5 ={1, "lili", 'M'}; //Data5: 1, lili, M
SaveData2(&Data5); //Data5: 2, lili2, M
若在指针传递中不想改变原结构体数据,可以使用const,表示只读
void SaveData2(const FuncaData* Data)
{
// error:const只读,不可修改
// Data->Num1 = 2;
// strcpy(Data->Name1, "lili2");
// Data->sex = 'M';
}
调用:
FuncaData Data7 ={1, "lili", 'M'}; //Data7: 1, lili, M
SaveData2(&Data7); //Data7: 1, lili, M
(6) 结构体变量作返回值
FuncaData SaveData3(FuncaData Data)
{
Data.Num1 = 2;
strcpy(Data.Name1, "lili2");
Data.sex = 'M';
return Data;
}
调用:
FuncaData Data6 ={1, "lili", 'M'}; //Data6: 1, lili, M
Data6 = SaveData3(Data6); //Data6: 2, lili2, M
2.结构体数组(定义,初始化,作函数参数,作返回值)
(1)定义结构体数组:和定义结构体变量一致,参考以上
typedef struct FUNCADATA
{
int Num1;
char Name1[20];
char sex;
}FuncaData;
(2)初始化结构体数组
//1.先定义再赋值
FuncaData szData1[10];
for (int i=0; i<10; i++)
{
szData1[i].Num1 = 0;
strcpy(szData1[i].Name1, "lili");
szData1[i].sex = 'M';
}
//2.定义时初始化
FuncaData szData2[2] = {{1, "lili", 'M'}, {2, "lili2", 'M'}};
3.结构体数组作函数参数
void SaveDatas1(int iDataCount, FuncaData* Data)
{
int n[100];
char name[100][10];
char sex[100];
for (int i=0; i<iDataCount; i++)
{
n[i] = Data[i].Num1;
strcpy(name[i], Data[i].Name1);
sex[i] = Data[i].sex;
}
Data[0].Num1 = 3;
strcpy(Data[0].Name1, "lili3");
Data[0].sex = 'F';
}
调用:
FuncaData szData2[2] = {{1, "lili", 'M'}, {2, "lili2", 'M'}};
SaveDatas1(sizeof(szData2)/sizeof(szData2[0]), szData2);
//before szData2:{1, "lili", 'M'}, {2, "lili2", 'M'}
//after szData2:{3, "lili3", 'F'}, {2, "lili2", 'M'}
注:sizeof(结构体)不等于结构体内所有成员占内存字节数只和
sizeof(类型) 等于该类型所占内存字节数
1.
typedef struct SDATA
{
int Num1;
}SData;
调用:
int n = sizeof(SData); //4
2.
typedef struct SDATA
{
char Name1[20];
}SData;
调用:
int n = sizeof(SData); //20
3.
typedef struct SDATA
{
char sex;
}SData;
调用:
int n = sizeof(SData); //1
4.
typedef struct SDATA
{
int Num1;
char Name1[20];
char sex;
}SData;
调用:
int n = sizeof(SData); //28
结构体的定义参考:结构体的使用_vs2010 结构体定义和使用-CSDN博客
结构体的初始化参考:
2.C语言结构体的定义,初始化,赋值,并与数组,指针,typedef的联合使用_c语言 typedef void 指针-CSDN博客
3.C | struct结构体 | 结构体数组 | typedef struct | 结构体初始化 | 结构体构造函数 | 结构体嵌套_结构体数组初始化赋值方式-CSDN博客
结构体做函数参数参考:
.1.结构体作为函数的参数_结构体可以用作函数参数吗-CSDN博客
2.结构体和数据结构--向函数传递结构体_结构体传递给函数-CSDN博客
3.【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 栈内存创建 )_c语言结构体数组作为函数参数-CSDN博客