C语言-结构体笔记2
Posted acrifhy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
文章来自微信公众号:内卡巴拉之树
欢迎关注:
以上是关于C语言-结构体笔记2的主要内容,如果未能解决你的问题,请参考以下文章