C语言结构体(传值vs传址)

Posted SuchABigBug

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体(传值vs传址)相关的知识,希望对你有一定的参考价值。

一、创建结构体

两种不同方式访问结构体成员:

  1. 访问操作符: ’ . ’

我们以书为例子,声明书包括名字,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);
  1. 访问操作符: ’ -> ’
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传址)的主要内容,如果未能解决你的问题,请参考以下文章

传值传址 结构体

10月19日--传值传址结构体

传值传址结构体

传值传址。以及结构体的知识点 例题

C语言函数中的传值和传址

C语言的传值与传址调用