结构体struct相关知识整理

本文详细整理了C/C++中struct的相关知识,包括struct大小的判断,变量定义与成员访问,作为函数参数的传递方式,以及typedef struct的使用。结构体在内存中的存储考虑了内存对齐,通过指针访问成员,以及直接传结构体变量和指针在函数调用中的区别。最后,讨论了typedef和#define的区别,并介绍了typedef struct在两种语言中的差异。

前言:struct是c/c++中一种自定义的变量类型,可以用来定义struct变量,在程序设计中使用struct可以使得程序更加整洁清晰。struct在c/c++中用法不完全相同,现将相关知识整理如下,方便日后查找和交流。

我们以以下结构体为例进行整理:

struct stu{
    char *name;         //姓名
    int num;            //学号
    int age;            //年龄
    char group;         //所在学习小组
    float score;        //成绩
}

知识点一:struct大小的判断

我们需要明确一点:结构体是一种变量类型,是创建变量的模板,不占用内存空间,只有结构体变量才占用内存空间

上述结构体所创建的变量在内存中如图所示分布:

     

理论上讲,struct成员在内存中连续存储的,但是在实际的编译过程中,成员之间会存在间隙,目的是为了内存对齐,提高寻址效率 。所以group成员本身大小为1个字节,但是为了方便寻址,系统分给其4个字节大小的成员,也就是说,有3个字节大小内存空间的间隙。

还需要注意一点,stu的第一个成员为指针类型,所以其所占内存大小为4个字节(对于32位系统来讲)

综上所述,stu的大小为   4字节*5 = 20字节

知识点二:struct变量的定义和成员访问

  • 定义了结构体变量之后才能在内存中实际的占有空间,一般比较常用的有3种:

第一种:先定义结构体类型,再定义结构体变量

struct stu{
    char *name;         //姓名
    int num;            //学号
    int age;            //年龄
    char group;         //所在学习小组
    float score;        //成绩
}

//对于c语言
struct stu stu1,stu2;

//对于c++
stu stu1,stu2;

这里需要注意下,在c语言中,定义变量的时候需要加上关键字struct ,c++中可加可不加。

第二种:定义结构体类型的同时定义结构体变量

struct stu{
    char *name;         //姓名
    int num;            //学号
    int age;            //年龄
    char group;         //所在学习小组
    float score;        //成绩
} stu1, stu2;

此种定义方式在c++和c语言中相同 

第三种:采用typedef struct的方式定义,此种方式在后面typedef的用法中详细介绍 

  • 成员的访问

对于结构体成员的访问有以下两种方式:

(*pointer).memberName   (.的优先级高于*,因此要加括号)

pointer->memberName

知识点三:struct作为函数参数

一般来说,将结构体变量作为参数传入函数有两种方式:直接传结构体变量和传结构体指针

typedef struct stu{
int a;
int b;
};

void sum(stu* s){          //传struct指针
   s->a = s->a + s->b;
}
void sums(stu s){          //直接传struct变量
   s.a = s.a + s.b;
}

int main(void)    
{ 
   stu s1={3,4};
   sums(s1);
   cout<<s1.a<<endl;      //输出结果为3
   sum(&s1);
   cout<<s1.a<<endl;      //输出结果为7
   return 0;    
}

从上面可以看出,通过直接传结构体变量的方式对结构体成员进行操作不会改变原结构体成员的值 ,而传结构体指针则是直接传入的结构体在内存中的地址,所以对结构体成员操作也就直接改变了结构体的值

除此之外,如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速

知识点四:typedef struct

  • typedef和#define的区别

typedef是对变量起一个别名;#define是进行简单的字符串替换

typedef是在编译时处理;#define是在预处理的时候进行字符串替换,在编译时进行检查

typedef有自己的作用域;#define没有作用域

typedef int* P1int;
#define P2int int* 

P1int p1,p2;     //p1,p2都是整形指针
P2int p3,p4;     //p1是整形指针,p2是整形变量
  • typedef struct

在c/c++中,typedef struct的用法有些区别

typedef struct Student{
    int a;
    int b;
}stu;
/*
    在c语言中,加上typedef之后,相当于给struct Student取了个别名,struct Student = stu
    如果不加的话, stu就是一个结构体变量
    如果不加,在定义结构体时就必须加上 struct
*/
/*
    在c++中,加上typedef之后,也相当于给struct Student取了个别名,struct Student = stu
    如果不加的话, stu也就是一个结构体变量
    但是与c不同的是,如果不加,在定义结构体时也不必加上struct
*/

 总结一下就是:

加上typedef,在c/c++中都是取了一个别名 struct Student = stu

不加typedef ,stu都是结构体变量,c在定义结构体变量的时候必须加上struct ,而c++中则不必须加

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值