本人坚持更新C语言和数据结构知识,可以收藏+关注随时了解😜😜😜?
目录
1.结构体是如何存储的?
2.结构体变量和结构体变量指针作为函数参数传递的问题
方法1:传递结构体变量本身
方法2:传递结构体变量的地址
1.结构体是如何存储的?
理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似
struct Student{
char *name;
int num;
int age;
char group;
float score;
};
struct Student stu;
我们定义一个结构体变量stu
char *占4个字节,因为指针变量永远是四个字节,两个int变量8个字节,一个char 占1个字节,float占4个字节,所以理论上是17个字节。
?但在编译器的具体实现中,各个成员之间可能会存在缝隙,对于 stu成员变量 group 和 score 之间就存在 3 个字节的空白填充。这样算来,stu1、stu2 其实占用了 17 + 3 = 20 个字节。
?这个现象叫做内存对齐,这个问题我们之后的文章会专门讲解。
2.结构体变量和结构体变量指针作为函数参数传递的问题
首先我们要明白指针的优点有哪些?
? ? ? ? 1.可以快速的传递数据,减少了内存的耗用(重要),作为形参传入只需要占用4个字节
? ? ? ? 2.执行速度块
? ? ? ? 3.表示一些复杂的数据结构
? ? ? ? 4.使函数返回一个以上的值(在一个函数中通过传入变量的地址,可以更改多个变量的值)
? ? ? ? 5.能直接访问硬件
? ? ? ? 6.能够方便处理字符串
那么在函数中传递参数时,我们是传递结构体变量的内容好呢?还是传递结构体的地址好呢?
现在我们假设需要定义一个函数,这个函数的功能是输出结构体变量中的内容。
我们该如何写呢?
方法1:传递结构体变量本身
struct Student
{
int age;
char sex;
char name[100];
};
void OutputStudent(struct Student stu)//需要传送108个字节
//对结构体变量输入,发送st的内容,也可以发送地址
{
cout << stu.age << endl;
cout << stu.sex << endl;
cout << stu.name << endl;
}
方法2:传递结构体变量的地址
void OutputStudent(struct Student *pstu) //只需要传输4个字节
{
cout << pstu->age << endl;
cout << pstu->sex << endl;
cout << pstu->name << endl;
}
上面两种方法:都可以实现结构体变量内容的输出
方法1是传递了结构体变量本身
方法2传递了结构体变量的指针
但是我们对比发现,传递结构体变量本身需要传递它所有变量占用的内存,有108个字节
但是传递结构体变量的地址形参只需要传递4个字节(对于这方面不理解的小伙伴,可以看看我的文章,指针变量到底占几个字节)
这也就是为什么指针变量可以减少内存的耗用,从而快速的传递数据,所以在都可以实现的情况下建议将地址作为参数传递
|