C语言基础知识:C语言中的结构体

本文详细介绍了C语言中的结构体,包括基本定义、结构体变量名、初始化、成员访问、结构体指针和结构体在函数参数中的应用。通过实例解析了结构体的使用方法,强调了结构体变量名不是地址,初始化结构体以及结构体成员访问的注意事项,以及结构体作为函数参数时的效率问题。
摘要由CSDN通过智能技术生成

目录

基本定义

结构体的变量名

结构体初始化

结构体成员的访问

结构体指针

结构体的赋值

结构体作为函数的参数


基本定义

结构体(struct)就是用来存放一组不同类型的数据的,C语言中的结构体是一种用户自定义数据类型,可以将不同类型的数据组合在一起形成一个新的类型。其语法形式为:

struct [结构体名] {
    数据类型 成员名1;
    数据类型 成员名2;
    数据类型 成员名3;
    ...
};

结构体是一个集合,是一种构造的数据类型,为了描述一个数据集自己定义出来的数据类型。结构体的成员(member)可以是任意类型的变量,也可以是结构体变量。

struct boy
{
  char name[51];   // 姓名
  int  age;        // 年龄
  int  height;     // 身高
  int  weight;     // 体重
  char figure[31];     // 身材
  char face[31];     // 颜值
}; //记得加分号

其中,结构体名是可选的,成员名可以自定义,成员之间用分号隔开。结构体定义后,可以通过以下方式声明结构体变量:

struct [结构体名] [结构体变量名];

或者直接在定义结构体时声明结构体变量:

struct [结构体名] {
    数据类型 成员名1;
    数据类型 成员名2;
    数据类型 成员名3;
    ...
} [结构体变量名];

结构体的变量名

和数组不一样,结构体变量名不是结构体变量的地址,结构体变量名就是变量名,就象 int a一样,只是不能直接输出,直接输出没有任何意义。取地址要用&。

  struct boy xiaoqiu1;
  printf("%d\n",xiaoqiu1);   // 没有意义
  printf("%p\n",xiaoqiu1);   // 没有意义,结构体变量名不是结构体变量的地址。
  printf("%p\n",&xiaoqiu1);  // 这才是结构体的地址

结构体初始化

采用memset函数初始化结构体,全部成员变量的值清零。

memset(&queen,0,sizeof(struct st_girl));
//或者
memset(&queen,0,sizeof(queen));

注意:如果把一个结构体的地址传给子函数,子函数用一个结构体指针(如struct st_girl *pst)来存放传入的结构体的地址,那么,在子函数中只能用以下方法来初始化结构体:

memset(pst,0,sizeof(struct st_girl));
//不能用以下方法来初始化结构体:
memset(pst,0,sizeof(pst));


因为子函数中用sizeof(pst),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。

结构体成员的访问

采用圆点 . 运算符可以访问(使用)结构的成员,结构体成员变量的使用与普通变量的使用相同。

#include<stdio.h>
#include<string.h>
#pragma pack(1)
 
// 定义一个结构体
struct boy
{
    char name[50];
    int age;
    int height;
};
 
int main()
{
    // 定义一个结构体变量
    struct boy xiaoqiu;
 
    memset(&xiaoqiu,0,sizeof(struct boy));//初始化
 
    strcpy(xiaoqiu.name,"小酋");
    xiaoqiu.age = 20;
    xiaoqiu.height = 168;
 
    printf("名字: %s\n",xiaoqiu.name);
    printf("年龄: %d\n",xiaoqiu.age);
    printf("身高: %d\n",xiaoqiu.height);
 
    return 0;
}

结构体指针

结构体是一种自定义的数据类型,结构体变量是内存变量,有内存地址,也就有结构体指针。

在指针章节中我们已经知道,采用不同数据类型的指针指向不同数据类型的变量的地址,这一规则也适用于结构体。

struct boy xiaoqiu;
struct boy *pst = &xiaoqiu;
//通过结构体指针可以使用结构体成员
(*pst).memberName
//或者
pst->memberName

结构体的赋值

结构体的成员如果是基本数据类型(int、char、double)可以用=号赋值,如果是字符串,字符串不是基本数据类型,可以用 strcpy 函数赋值,如果要把结构体变量的值赋给另一个结构体变量,可以使用 memcpy 函数。

参数说明:

  1. src 源内存变量的起始地址
  2. dest 目的内存变量的起始地址
  3. n 需要复制内容的字节数
#include<stdio.h>
#include<string.h>
#pragma pack(1)
 
// 定义一个结构体
struct boy
{
    char name[50];
    int age;
};
 
int main()
{
    // 定义一个结构体变量
    struct boy xiaoqiu1,xiaoqiu2;
 
    memset(&xiaoqiu1,0,sizeof(struct boy));//初始化
    memset(&xiaoqiu2,0,sizeof(struct boy));//初始化
 
    strcpy(xiaoqiu1.name,"小酋");
    xiaoqiu1.age = 20;
 
    memcpy(&xiaoqiu2,&xiaoqiu1,sizeof(struct boy));
 
    printf("名字:%s 年龄: %d\n",xiaoqiu1.name,xiaoqiu1.age);
    printf("名字:%s 年龄: %d\n",xiaoqiu2.name,xiaoqiu2.age);
 
    return 0;
}
 

结构体作为函数的参数

结构体是多个变量集合,作为函数参数时就可以传递整个集合,也就是所有成员。如果结构体成员较多,函数参数的初始化和赋值的内存开销会很大,影响程序的运行效率。所以最好的办法就是传递结构体变量的地址。

#include<stdio.h>
#include<string.h>
#pragma pack(1)
 
// 定义一个结构体
struct boy
{   
    char name[50];
    int age;
};
 
// 给结构体赋值的函数
void setvalue(struct boy *pst)
{
 
    strcpy(pst->name,"小酋");
    pst->age = 20;
}
 
int main()
{
    // 定义一个结构体变量
    struct boy xiaoqiu1;
    memset(&xiaoqiu1,0,sizeof(struct boy));
 
    setvalue(&xiaoqiu1);
 
    printf("名字:%s 年龄: %d\n",xiaoqiu1.name,xiaoqiu1.age);
 
    return 0;
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值