typedef struct
dog
{
char
name
[
50
];
char
sex
[
5
];
int
age
;
}
Dog
;
void
fun08
()
{
Dog d1
=
{
"
旺财
"
,
"
公
"
,
2
};
Dog d2
=
{
"
富贵
"
,
"
母
"
,
1
};
printf
(
"%s %s %d\n"
,
d1
.
name
,
d1
.
sex
,
d1
.
age
);
printf
(
"%s %s %d\n"
,
d2
.
name
,
d2
.
sex
,
d2
.
age
);
Dog
*
p
= &
d1
;
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
strcpy
(
p
->
name
,
"
黑豹
"
);
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
}
结构体指针变量
定义
struct 结构体名称 *指针变量名 = &结构体变量;
操作语法
指针变量名->成员名称
示例1
void
fun03
()
{
struct
stu s1
=
{
"
小明
"
,
"
男
"
,
18
};
struct
stu
*
p
= &
s1
;
printf
(
"%s %s %d\n"
,(
*
p
).
name
,(
*
p
).
sex
,(
*
p
).
age
);
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
strcpy
(
p
->
name
,
"
大明
"
);
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
}
示例2堆区申请内存
void
fun04
()
{
struct
stu
*
p
=
(
struct
stu
*
)
calloc
(
1
,
sizeof
(
struct
stu
));
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
strcpy
(
p
->
name
,
"
大明
"
);
strcpy
(
p
->
sex
,
"
女
"
);
p
->
age
=
18
;
printf
(
"%s %s %d\n"
,
p
->
name
,
p
->
sex
,
p
->
age
);
}
结构体数组
定义
struct 结构体名称 数组名[长度];
初始化
struct
结构体名称 数组名
[
长度
] = {{
成员值
1,
成员值
2,..},{
成员值
1,
成员值2,..},...};
示例1
struct person
{
char name[50];
char sex[5];
int age;
};
void fun05()
{
struct person persons[] = {{"张三
","
男
",18},{"
李四
","
女
",20},{"
小红","
女
",19}};
int len = sizeof(persons)/sizeof(struct person);
for(int i = 0; i < len; i++)
{
printf("%s %s %d\n",persons[i].name,persons[i].sex,persons[i].age);
}
}
示例2
struct
person
{
char
name
[
50
];
char
sex
[
5
];
int
age
;
};
void
fun06
()
{
struct
person ps
[
3
];
memset
(
ps
,
0
,
sizeof
(
ps
));
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
scanf
(
"%s %s %d"
,
ps
[
i
].
name
,
ps
[
i
].
sex
,
&
ps
[
i
].
age
);
}
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
printf
(
"%s %s %d\n"
,
ps
[
i
].
name
,
ps
[
i
].
sex
,
ps
[
i
].
age
);
}
}
示例3
void
fun07
()
{
struct
person
*
ps
=
(
struct
person
*
)
calloc
(
3
,
sizeof
(
struct
person
));
memset
(
ps
,
0
,
sizeof
(
ps
));
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
scanf
(
"%s %s %d"
,
ps
[
i
].
name
,
ps
[
i
].
sex
,
&
ps
[
i
].
age
);
}
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
printf
(
"%s %s %d\n"
,
ps
[
i
].
name
,
ps
[
i
].
sex
,
ps
[
i
].
age
);
}
}
指针变量作为结构体成员
注意
:
不要操作结构体变量中未初始化指针
示例
typedef struct cat
{
char *name;
int age;
}Cat;
void fun09()
{
//1,
不要操作结构体变量中未初始化指针
//
定义结构体变量
,
但不初始化
,
此时其中的指针为野指针
// Cat c1;
// printf("%s\n",c1.name);
//
定义结构体变量
,
使用
memset
清
0,
此时其中的指针为空指针
Cat c2;
memset(&c2,0,sizeof(c2));
printf("%s\n",c2.name);
}
指针成员初始化
void fun10()
{
Cat c = {"布丁
",2};
printf("%s\n",c.name);
}
//
注意
:
此时结构体变量
c
中指针成员指向文字常量区
,
此时不能修改其指向地址中的值
,只能读取或修改其指向的地址
指针成员堆区初始化
void fun11()
{
Cat c;
c.name = (char *)malloc(50);
strcpy(c.name,"tom");
c.age = 2;
printf("%s\n",c.name);
c.name[0] = 'T';
printf("%s\n",c.name);
if (c.name != NULL)
{
free(c.name);
c.name = NULL;
}
}
//
使其指针成员指向堆区
,
那么就可以对其进行读写
结构体指针变量堆区初始化
,
指针成员堆区初始化:
void fun12()
{
/*
1,
先在堆区初始化结构体指针变量
2.
然后在堆区初始化成员指针变量
3,...
4,
释放成员指针变量堆区空间
5,
释放结构体指针变量堆区空间
*/
Cat *c = (Cat *) malloc(sizeof(Cat));
c->age = 3;
c->name = (char *)malloc(20);
strcpy(c->name,"布丁
");
printf("%s %d\n",c->name,c->age);
if (c->name != NULL)
{
free(c->name);
c->name = NULL;
}
if (c != NULL)
{
free(c);
c = NULL;
}
}
结构体指针数组堆区初始化
,
结构体指针变量堆区初始化
,
指针成员堆区初始化
void fun13()
{
/*
1,
先在堆区初始化结构体指针数组
2,
再在堆区初始化结构体指针变量
3.
然后在堆区初始化成员指针变量
3,...
4,
释放成员指针变量堆区空间
5,
释放结构体指针变量堆区空间
6,
释放结构体指针数组堆区空间
*/
Cat **cs = (Cat **) calloc(3,sizeof(Cat *));
for(int i = 0; i < 3; i++)
{
Cat *c = (Cat *)malloc(sizeof(Cat));
c->name = (char *)malloc(20);
scanf("%s %d",c->name,&(c->age));
cs[i] = c;
}
for(int i = 0; i < 3; i++)
{
printf("%s %d\n",cs[i]->name,cs[i]->age);
if (cs[i]->name != NULL)
{
free(cs[i]->name);
cs[i] = NULL;
}
if (cs[i] != NULL){
free(cs);
cs[i] = NULL;
}
}
if (cs != NULL)
{
free(cs);
cs = NULL;
}
}
浅拷贝
:
拷贝地址
typedef struct test01
{
char *str;
} Test01;
void fun14()
{
Test01 t01;
t01.str = (char *) malloc(20);
strcpy(t01.str,"德玛西亚
");
Test01 t02;
t02 = t01;//此时
t02
的中
str
与
t01
中的
str
指向同一堆区地址
,
发生浅拷贝
printf("t01.str = %s\n",t01.str);
printf("t02.str = %s\n",t02.str);
strcpy(t02.str,"艾欧尼亚
");
printf("t01.str = %s\n",t01.str);
printf("t02.str = %s\n",t02.str);
//
当释放是会产生错误
if (t01.str != NULL)
{
free(t01.str);
t01.str = NULL;
}
if (t02.str != NULL)
{
free(t02.str);
t02.str = NULL;
}
}
深拷贝:
拷贝内容
void fun15()
{
Test01 t01;
t01.str = (char *) malloc(20);
strcpy(t01.str,"德玛西亚
");
Test01 t02;
t02.str = (char *) malloc(20);
strcpy(t02.str,t01.str);//深拷贝
printf("t01.str = %s\n",t01.str);
printf("t02.str = %s\n",t02.str);
strcpy(t02.str,"艾欧尼亚
");
printf("t01.str = %s\n",t01.str);
printf("t02.str = %s\n",t02.str);
if (t01.str != NULL)
{
free(t01.str);
t01.str = NULL;
}
if (t02.str != NULL)
{
free(t02.str);
t02.str = NULL;
}
}