普通结构体变量和结构体指针变量作为函数传参问题

发布时间 2023-04-06 11:49:58作者: 一往而深,
#include "stdio.h"
#include "string.h"
//基本认知
/*
 * 结构体变量之间可以相互赋值
 * struct student a;//定义结构体变量
 * 1.a.age//结构体变量访问结构体成员
 * struct student *p = &a//指针指向结构体变量的地址
 * 2.p->age//指针访问结构体成员 等价于(*p).age  (*p表示结构体所指向的变量)
 */
//需求:我们需要对定义的结构体变量进行赋值
//定义结构体
struct student
{
    int sid;//占4B
    char name[200];//占20B
    int age;//占4B
};
//赋值函数:传递结构体变量
void f1(struct student ss)
{
    ss.age =23;
    ss.sid =1000;
    strcpy(ss.name,"zhangsan");
}
//赋值函数:传递结构体指针变量
void f2 (struct student *ss)
{
    ss->age=23;//表示ss所指向的结构体中的age这个成员
    ss->sid=1000;
    strcpy(ss->name,"zhangsan");
}
//输出函数1
void g1(struct student p)
{
    printf("%d %d %s\n",p.sid,p.age,p.name);
}
//输出函数2
void g2(struct student *p)
{
    printf("%d %d %s\n",p->sid,p->age,p->name);
}
int main()
{
  //定义结构体变量
  struct student s;
  //定义结构体类型的指针变量并指向s
  struct student *parr = &s;
  f1(s);
  f2(parr);
  g1(s);
  g2(parr);
    return 0;
}

以上的函数分别使用普通结构体变量和结构体指针变量传输来实现对结构体里面的成员进行赋值操作

但是这两种操作最大不同是使用这两种方式所传输的数据量有很大不同,传输普通的结构体变量我们最少需要传输208个字节(等于所有成员变量所占内存之和),而传输指针变量不管结构体所占空间有多大,每次进行传输都只传递4个字节的大小(所有的指针变量都只占4个字节,之和计算机的地址总线有关)。当我们传输的数据量较大时,这两种传输的方式的优劣就显现出来了