C语言-结构体笔记2

C语言-结构体笔记2

在这里插入图片描述

与内置类型的变量类似,您也可以将结构变量传递给函数。

将结构传递给函数的方法:

#include <stdio.h>
struct student {
   char name[50];
   int age;
};

// function prototype
void display(struct student s);

int main() {
   struct student s1;

   printf("Enter name: ");

   // read string input from the user until \n is entered
   // \n is discarded
   scanf("%[^\n]%*c", s1.name);

   printf("Enter age: ");
   scanf("%d", &s1.age);

   display(s1); // passing struct as an argument

   return 0;
}

void display(struct student s) {
   printf("\nDisplaying information\n");
   printf("Name: %s", s.name);
   printf("\nAge: %d", s.age);
}

输出:

Enter name: Bond
Enter age: 13

Displaying information
Name: Bond
Age: 13

这里创建了struct student类型的struct变量s1,使用display(s1)将变量传递给display()函数

从函数返回结构

从函数返回结构的方法:

#include <stdio.h>
struct student
{
    char name[50];
    int age;
};

// function prototype
struct student getInformation();

int main()
{
    struct student s;

    s = getInformation();

    printf("\nDisplaying information\n");
    printf("Name: %s", s.name);
    printf("\nRoll: %d", s.age);
    
    return 0;
}
struct student getInformation() 
{
  struct student s1;

  printf("Enter name: ");
  scanf ("%[^\n]%*c", s1.name);

  printf("Enter age: ");
  scanf("%d", &s1.age);
  
  return s1;
}	

在这里,使用s = getInformation()来调用getInformation()函数。 陈述。 该函数返回struct学生类型的结构。 返回的结构从main()函数显示。

注意,getInformation()的返回类型也是struct student。

通过引用传递结构

还可以引用传递结构,就像引用传递内置类型的变量一样。

在按引用传递期间,结构变量的内存地址将传递给函数。

#include <stdio.h>
typedef struct Complex
{
    float real;
    float imag;
} complex;

void addNumbers(complex c1, complex c2, complex *result); 

int main()
{
    complex c1, c2, result;

    printf("For first number,\n");
    printf("Enter real part: ");
    scanf("%f", &c1.real);
    printf("Enter imaginary part: ");
    scanf("%f", &c1.imag);

    printf("For second number, \n");
    printf("Enter real part: ");
    scanf("%f", &c2.real);
    printf("Enter imaginary part: ");
    scanf("%f", &c2.imag);

    addNumbers(c1, c2, &result); 
    printf("\nresult.real = %.1f\n", result.real);
    printf("result.imag = %.1f", result.imag);
    
    return 0;
}
void addNumbers(complex c1, complex c2, complex *result) 
{
     result->real = c1.real + c2.real;
     result->imag = c1.imag + c2.imag; 
}

输出:

For first number,
Enter real part:  1.1
Enter imaginary part:  -2.4
For second number, 
Enter real part:  3.4
Enter imaginary part:  -3.2

result.real = 4.5
result.imag = -5.6  

在上面的程序中,三个结构变量c1,c2和result的地址传递给addNumbers()函数。 在这里,result通过引用传递。

当addNumbers()内部的result变量被更改时,main()函数内部的result变量也被相应地更改。

C Unions

我们一般称为c共用体或联合体

联合体是用户定义的类型,类似于C中的结构体,除了一个关键区别:

结构体会分配足够的空间来存储其所有成员,而联合体一次只能容纳一个成员。
如何定义一个联合体?
我们使用union关键字定义联合。比如说:

union car
{
  char name[50];
  int price;
};

上面的代码定义了一个派生类型union car

创建联合体变量

定义联合体后,它将创建用户定义的类型。 然而没有分配内存。 为了给它分配内存并使用它,我们需要创建变量。

这是我们创建联合体变量的方法:

union car
{
  char name[50];
  int price;
};

int main()
{
  union car car1, car2, *car3;
  return 0;
}

另一个创建联合体变量的方法是:

union car
{
  char name[50];
  int price;
} car1, car2, *car3;

在两种方式里,属于union car的联合体变量car1,car2,和一个联合体指针car3都被创建了

访问联合体成员

我们用 . 操作符来访问联合体成员。对于联合体指针变量,我们用 -> 操作符来访问。

在上面的例子中:

  • 要访问car1的price,请使用car1.price。
  • 要访问car3的price,可以使用(* car3).price或car3-> price。

联合体与结构体之间的区别

让我们用一个例子来说明它们之间的区别:

#include <stdio.h>
union unionJob
{
   //defining a union
   char name[32];
   float salary;
   int workerNo;
} uJob;

struct structJob
{
   char name[32];
   float salary;
   int workerNo;
} sJob;

int main()
{
   printf("size of union = %d bytes", sizeof(uJob));
   printf("\nsize of structure = %d bytes", sizeof(sJob));
   return 0;
}

输出:

size of union = 32 bytes
size of structure = 40 bytes

为什么联合体和结构体变量在大小上会存在这种差异?

sJob的大小为40个字节,因为name [32]的大小为32个字节,salary的大小是4个字节,workerNo的大小是4个字节;

但uJob的大小为32个字节,这是因为联合体变量的大小总是其最大元素的大小。 在上面的示例中,其最大元素(name [32])的大小为32个字节。

使用联合体时,所有成员会共享相同的内存。

示例:访问联合体成员

#include <stdio.h>
union Job {
   float salary;
   int workerNo;
} j;

int main() {
   j.salary = 12.3;

   // when j.workerNo is assigned a value,
   // j.salary will no longer hold 12.3
   j.workerNo = 100;

   printf("Salary = %.1f\n", j.salary);
   printf("Number of workers = %d", j.workerNo);
   return 0;
}

输出:

Salary = 0.0
Number of workers = 100

但如果对以上代码进行如下修改:

double salary;
printf("Salary = %.1lf\n", j.salary);

将会输出:

Salary = 12.3
Number of workers = 100

想知道什么时候需要使用unions,可阅读https://stackoverflow.com/questions/252552/why-do-we-need-c-unions

文章来自微信公众号:内卡巴拉之树

欢迎关注:

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值