1.结构体定义
声明一个结构体: typedef struct 和 struct | C | C++ |
typedef struct A{ int num; long length; }B; | 申请结构体变量的方法有两种: ①struct A 变量名; ②B 变量名; | 申请结构体变量的方法有三种: ①struct A 变量名; ②B 变量名; ③A 变量名; |
typedef struct{ int num; }B; | 在声明变量的时候就可: B 变量名 | |
typedef struct{ int num; }B,*C; | 定义了结构体类型B; 以及结构体指针类型C; | |
typedef struct{ int num; long ; }AA,BB,CC; | AA,BB,CC三者都是同一种结构体类型。声明变量时用任何一个都可以。 | 同左。 |
struct A{ int num; }a1; | 声明了结构体类型struct A, 同时也声明了结构体变量a1。 | |
struct{ int num; }a1; | 声明了结构体变量a1。 |
2.结构体赋值
struct st1{
int a;
int b;
};
//1 对成员赋值
//1.1 用{}形式。
struct st1 st1 = {1,2,3}; //定义并初始化结构体变量
//1.2 linux kernel风格.
struct st1 st1 = { //定义并初始化结构体变量
.a = 1;
.b = 2;
};
//2 对整体赋值.
struct st1 a, b; //声明结构体变量
b = a; //结构体直接赋值
//3 结构体作为函数返回值对另一个结构体赋值.
struct st1 func1();
struct st1 a = func1();
直接赋值的不安全因素:(C语言)
struct A{
char v1[20];
int v2;
} a,b;
a = b;
这没有任何问题.
但是:
struct B{
char *v1;
int v2;
} c,d;
c = d;
这种结构体赋值,就需要注意(包括在C++里)。
对于指针赋值,即不是数据进行了复制保存而是多了一个指针指向而已,这样一旦d对象释放,c的指向就成了非法的垃圾数据。
所以在c中,自定义类型、数组都是要另外自己定义复制函数的,这主要是代码安全考虑,而不是语言层面考虑。
3.结构体的定义、声明、赋值举例
#include <stdio.h>
typedef struct st1 {
int variable1;
int variable2;
}ST_MY; //定义结构体类型的时候,里面是分号,定义完毕后要加分号。
ST_MY func1()
{
ST_MY h = { 77, 88};
return h;
}
int main()
{
ST_MY a = { 33, 44}; //定义并初始化一个结构体
ST_MY b = {
.variable1 = 55, //定义并初始化一个结构体时,可以点赋值
}; // 点赋值只能是初始化结构体变量时才能用
ST_MY c;
ST_MY d, e;
c = a;//结构体直接赋值(方法1)
d = func1();//结构体直接赋值(方法2)
e.variable2=77; //声明之后为一个结构体变量赋值效果.不同于定义并初始化一个结构体变量。
printf("a.variable1 a.variable2 is %d %d\n", a.variable1, a.variable2);
printf("b.variable1 b.variable2 is %d %d\n", b.variable1, b.variable2);
printf("c.variable1 c.variable2 is %d %d\n", c.variable1, c.variable2);
printf("d.variable1 d.variable2 is %d %d\n", d.variable1, d.variable2);
printf("e.variable1 e.variable2 is %d %d\n", e.variable1, e.variable2);
return 0;
}