C语言结构体(传值vs传址)
Posted SuchABigBug
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体(传值vs传址)相关的知识,希望对你有一定的参考价值。
一、创建结构体
两种不同方式访问结构体成员:
- 访问操作符: ’ . ’
我们以书为例子,声明书包括名字,id以及价格
struct Book{
char name[20];
int id;
int price;
};
接着我们实例化
struct Book bookClass = {"C语言", 1, 39};
下面的我们可以看到用.
来访问结构体内的成员
printf("Book name : %s \\n", bookClass.name);
printf("Book id : %d \\n", bookClass.id);
printf("Book price : %d \\n", bookClass.price);
- 访问操作符: ’ -> ’
struct Book* ptrBook = &bookClass;
printf("Book name : %s \\n", (*ptrBook).name);
printf("Book id : %d \\n", (*ptrBook).id);
printf("Book price : %d \\n", (*ptrBook).price);
printf("Book name : %s \\n", ptrBook->name);
printf("Book id : %d \\n", ptrBook->id);
printf("Book price : %d \\n", ptrBook->price);
我们如果用指针的方式访问结构体成员,(*ptrBook)通过地址解引用成员的值,为了更简介方便, 通常用符号->
来访问结构体内的成员.
二、调用结构体比较
看下面代码调用和传入结构体哪一种方式更好一点呢?
#include <stdio.h>
struct B{
char c;
short s;
double d;
};
struct Stu{
struct B sb;
char name[20];
int age;
char id[20];
};
void print1(struct Stu s){
printf("%c %d %lf %s %d %s \\n", s.sb.c, s.sb.s, s.sb.d, s.name, s.age, s.id);
}
void print2(struct Stu *p){
printf("%c %d %lf %s %d %s \\n", p->sb.c, p->sb.s, p->sb.d, p->name, p->age, p->id);
}
int main(){
struct Stu s = {{'w', 10, 123}, "henry", 26, 007};
print1(s);
print2(&s);
return 0;
}
print1函数,传值调用
print2函数,传址调用
当调用print1(s),传结构体s进去的时候,print1接收的时候形参也得创建一块相对应大的空间来接收这个数据,从空间的角度讲,浪费一大块空间
如果是传址调用,并不会有额外的开销,传参的效率更高,还有个优点是对创建的结构体内容进行改变。
函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能下降
以上是关于C语言结构体(传值vs传址)的主要内容,如果未能解决你的问题,请参考以下文章