指向结构体数组的指针
struct student t[3] = {{0, "zhang", 20}, {1, "li", 20}, {0, "张三", 20}};
结构中的数组成员和指针成员
一个结构中可以有数组成员,也可以有指针成员,如果是指针成员结构体成员在初始化和赋值的时候就需要提前为指针成员分配内存。
struct man
{
char name[100];
int age;
};
struct man
{
char *name;
int age;
};
在堆中创建的结构体
如果结构体有指针类型成员,同时结构体在堆中创建,那么释放堆中的结构体之前需要提前释放结构体中的指针成员指向的内存。
struct man
{
char *name;
int age;
};
struct man *s = malloc(sizeof(struct man) * 2);
s[0].name = malloc(10 * sizeof(char));
s[1].name = malloc(10 * sizeof(char));
将结构作为函数参数
将结构作为函数参数
将结构指针作为函数参数
结构,还是指向结构的指针
在定义一个和结构有关的函数,到底是使用结构,还是结构的指针?
指针作为参数,只需要传递一个地址,所以代码效率高
如果一个结构体变量做为函数的参数,效率极低。同时老的C编译器都不支持传递结构变量,只支持传递结构指针。
远指针与近指针
返回值区别:返回结构体变量和数组变量
代码示例
struct student {
int id;
char name[100];
int age;
}
struct man {
int id;
char *name;
int age;
}
int main()
{
struct student t1 = {0, "张三", 20};
struct student *p = &t1;
printf("s1 name = %s\n", p->name); // 张三
struct student t[3] = {{0, "zhang", 20}, {1, "li", 20}, {0, "张三", 20}};
struct student *p = t1;
printf("s1 name = %s\n", p.name); // zhang
for (int i = 0; i < 3; i++) {
printf("s%d name %s\n", i, p[i].name);
}
// 结构体在堆中.
struct man *m = malloc(sizeof(struct man));
m->id = 1;
m->age = 20;
// 结构体的元素也在堆中.
m->name = malloc(10);
strcpy(m->name, "hello");
printf("id=%d age=%d name=%s\n", m->id, m->age, m->name);
free(m->name);
free(m);
// 结构体数组.
struct man *m = malloc(sizeof(struct man) * 10);
for (int i = 0; i < 10; i++) {
m[i].id = i;
m[i].age = i;
m[i].name = malloc(10);
sprintf(m[i].name, "%d", i);
}
// 打印.
for (int i = 0; i < 10; i++) {
printf("id = %d, age = %d, name = %s\n", m[i].id, m[i].age, m[i].name);
}
// 销毁.
for (int i = 0; i < 10; i++) {
free(m[i].name);
}
free(m);
struct man m1 = {0, "zhang", 20};
func1(m1);
printf("id = %d, name = %s\n", m1.id, m1.name); // id = 0, name = li
func2(&m1);
printf("id = %d, name = %s\n", m1.id, m1.name); // id = 2, name = li
return 0;
}
void func1 (struct man m)
{
printf("id = %d, age = %d, name = %s\n", m.id, m.age, m.name);
strcpy(m.name, "li");
m.id = 2;
}
void func2 (struct man *m)
{
printf("id = %d, age = %d, name = %s\n", m.id, m.age, m.name);
strcpy(m.name, "li");
m.id = 2;
}
// 函数返回结构体
struct man func3()
{
struct man *m = malloc(sizeof(struct man));
m->id = 1;
m->age = 20;
strcpy(m->name, "hello");
return m;
}
// 返回值无效
char *func4()
{
char buf[100] = {"hello"};
return buf
}