首页 > 代码库 > struct结构体详解

struct结构体详解

为什么要有结构体

结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型。以方便日后的使用。

在实际项目中,结构体是大量存在的。研发人员常使用结构体来封装一些属性来组成新的类型。由于C语言内部程序比较简单,研发人员通常使用结构体创造新的“属性”,其目的是简化运算。


结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。让使用者不必关心这个是什么,只要根据定义使用就可以了。


C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private

 

#include<stdio.h>

#if 1

//复数运算用结构体实现

typedef struct complex//a + bi

{

double real;

double imag;

   //[常见错误]

   //struct complex data;//错误,递归定义

   //struct complex *next;//可以,自引用,类型是struct complex * 4B

}Complex;


Complex comAdd(Complex first,Complex second)

{

Complex result;                        //变量.成员

result.real = first.real + second.real;//Complex类型变量不可相加,引用成员

result.imag = first.imag + second.imag;

return result;

}

Complex inputCom()

{

   Complex c;

   scanf("%lf%lf",&c.real,&c.imag);

   return c;

}

void echo(Complex c)

{

printf("%g%+gi ",c.real,c.imag);

// "%g" ,意思就是在 "%f" 格式(实型的小数形式)和 "%e" 格式(实型的指数形式)当// 中,选择比较简短的表达           方式,并且不显示小数点后面结尾的一些 0

//"%g%+gi" 若结果为负没有用,-1-2i;若结果为正,虚数应有+号 1+2i,否则是1 2i

}

void main(void)

{

//Complex c1 = {1,2};//对变量的成员初始化{}

//Complex c2 = {3,-4};//运算:同类型赋值,取址(结构体变量占内存所以有地址)

Complex  c1,c2,c;

printf("输入复数1: ");

c1 = inputCom();

printf("输入复数2: ");

c2 = inputCom();

c=comAdd(c1,c2);

echo(c);

putchar(10);//换行

}

#endif


结构体内存对齐

  变量非连续存储

  • 结构体对齐模数k是结构体数据成员中最大类型的宽度(4),变量长度为k的最小整数倍  

    变量对齐模数是成员和结构体对其模数的最小值Char 1B,struct 4B 取小


wKiom1Qm0oqQq14UAAA4IDCSAq0586.jpg

wKiom1Qm00yi5mnUAAC9QjvcAYM572.jpg

      8 B                      12B

  • 指定结构体对齐模数:VC 项目---属性---配置属性---C++---代码生成--指定对齐模数

  • 结构体对齐和指定里最小值

    #pragma pack(2)

      6B                       10B                                                    

    #pragma pack(8)

      8(取其小)                                 12B

 

结构体指针对变量进行访问

Complex c

Struct *p=&c;

P->real;

p->real.year = 2002;

(*p).real;

数组初始化:

 

C++中的结构体与类的区别

类与结构体在C++中有三点区别。

1class中默认的成员访问权限是private的,而struct中则是public的。

2)从class继承默认是private继承,而从struct继承默认是public继承。

3C++的结构体声明不必有struct关键字,而C语言的结构体声明必须带有关键字(使用typedef别名定义除外)。

 

 


本文出自 “sunnyting” 博客,转载请与作者联系!

struct结构体详解