首页 > 其他分享 >结构体

结构体

时间:2024-02-01 22:36:54浏览次数:22  
标签:变量 int num student 结构 struct

1.结构体与结构体指针

1.1 结构体的定义、引用、初始化

声明一个结构体类型的一般形式如下。首先声明结构体类型,再定义变量名,如struct stduent stu1, stu2;

struct 结构体名
{成员表列};

注意,结构体的初始化只能在一开始定义,即如果结构体变量已经定义,那么只能对它的每个成员单独赋值,如s.num= 1003;
采用“结构体变量名.成员名”的形式来访问结构体成员。在进行打印输出时,必须访问到成员,而且printf中的%类型要与各成员匹配,使用scanf读取标准输入时,也必须是各成员取地址,然后进行存储,不可以直接对结构体变量取地址

#include<stdio.h>
#include<stdlib.h>

struct student{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
}; //结构体类型声明,struct为关键字,student为结构体名

int main()
{
    struct student s = {1001, "lili", 'f',21, 98.5, "nanjing"};//定义及初始化
    // struct student exmple;  //错误写法,结构体的初始化只能在一开始定义
    // exmple = {1001, "lele", 'm', 20, 98.5, "nanjing"};
    //结构体数组的定义
    struct student sarr[3];
    for(int i=0; i<3; i++)
    {
        scanf("%d%s %c%d%f%s",&sarr[i].num,sarr[i].name, &sarr[i].sex, 
                                &sarr[i].age, &sarr[i].score, sarr[i].addr);
    }
    printf("-------------------------------------\n");
    for(int i=0; i<3; i++)
    {
        printf("%d %s %c %d %5.2f %s\n",sarr[i].num, sarr[i].name, sarr[i].sex, 
                                           sarr[i].age, sarr[i].score, sarr[i].addr);
    }
    return 0;
}
  • 另外,一个结构体变量所占内存空间的大小并不是所有成员所占字节相加的结果,还要考虑到对齐,所以工作上建议直接使用sizeof(s)算出所占字节数。
  • 运算符.->的区别:.是结构体变量的成员选择,而->方便于结构体指针的成员选择。

1.2 结构体指针

一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设置一个指针变量,用它指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。并且,指针变量也通过偏移来指向结构体数组中的元素。接下来看结构体指针的使用。

#include <stdio.h>
#include <stdlib.h>

struct student //结构体指针
{
    int num;
    char name[20];
    char sex;
};

int main()
{
    struct student s = {1001, "lilei", 'm'};
    struct student sarr[3]={1001, "lilei", 'm', 1005, "zhangsan", 'm', 1003, "lili", 'f'};
    struct student *p; //定义结构体指针
    int num;
    p = &s;
    printf("%d %s %c\n",p->num, p->name, p->sex);

    p = sarr; //注意,sarr中已经是数组的首地址

    printf("%d %s %c\n",(*p).num, (*p).name, (*p).sex);//结构体变量获取成员
    printf("%d %s %c\n", p->num, p->name, p->sex);//指针获取成员,少打2个字符更方便
    printf("-------------------------------------\n");

    num = p->num++;//第一步,忽略++:num=p->num;
    //第二步,因为->优先级比++高所以看成一个整体:p->num++;
    printf("num=%d,p->num=%d\n",num, p->num); //1001,1002

    num = p++->num; //这里用到指针偏移。首先第一步:num=p->num;
    //第二步,指针p向后偏移,从指向变量sarr[0]变为指向sarr[1]:p++;
    printf("num=%d,p->num=%d\n",num, p->num);  //1002, 1005

    return 0;  
}

1.3 typedef的使用

每次都用struct student s来定义结构体变量有些麻烦,可以选择使用typedef取别名,这样声明结构体变量可以更短更方便。

#include <stdio.h>

typedef struct student{
    int num; //学号
    char name[20];
    char sex;
}stu,*pstu;

使用stu定义结构体变量和使用struct student定义结构体变量是等价的;pstu等价于struct student*

2.C++的引用讲解

对于C++,首先新建源文件时,名字需要叫main.cpp,为什么要额外使用C++的引用,或者C语言的说法是取地址,是因为引用很便捷。

#include <stdio.h>
#include <stdlib.h>
//把&写到形参的位置是C++的语法,称为引用,这个时候操作b和在主函数里边使用a等价的
void modify_num(int& b)
{
	++b;
}

void modify_pointer(int*& p)//在子函数内操作p和主函数操作p手法一致
{
	p = (int*)malloc(20);
	p[0] = 5;
}
int main()
{
	int a = 10;
	modify_num(a);
	printf("a=%d\n", a);
	int* p = NULL;
	modify_pointer(p);
	printf("p[0]=%d\n", p[0]);
	return 0;
}

我们在修改函数外的某一变量时,使用了引用后,在子函数内的操作和函数外操作手法一致,这样编程效率较高,对于初学者理解也很方便。
C++引用方法:主函数定义了什么类型,形参就写什么类型然后&最靠近变量名即可。

标签:变量,int,num,student,结构,struct
From: https://www.cnblogs.com/paopaotangzu/p/17987519

相关文章

  • HTTP报文结构详解
    HTTP/HTTPS简介HTTP协议是HyperTextTransferProtocol(超文本传输协议)的缩写,是用于从万维网(WWW:WorldWideWeb)服务器传输超文本到本地浏览器的传送协议。HTTP工作在TCP/IP协议体系中的TCP协议上,是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。HT......
  • python的十大数据结构之堆队列heapq(heap queue)
    heapqueque(堆队列),是一个完全二叉树,并且满足一个条件:每个节点(叶节点除外)的值都大于等于(或小于等于)它的子节点。提供了构建小顶堆的方法和一些小顶堆的基本操作方法(如入堆、出堆等),可以用于实现堆排序算法。创建堆的两种方法:importheapqlists=[3,10,20,52,2,83,52......
  • 《计算机体系结构》观后感
    《计算机体系结构》这本书为我们揭示了计算机系统的内部工作原理和构造方式。从其理论部分到实际应用,从硬件实现到软件交互,都为我们提供了全面的知识体系。作为一本计算机科学的经典之作,它不仅帮助我深入理解计算机的内部工作机制,更让我意识到在实际工作中,如何更好地运用这些知识,......
  • 《计算机体系结构》观后感
    观看完《计算机体系结构》,对于深入理解计算机系统的本质和运行机制具有重要意义。它不仅涵盖了计算机体系结构的基本概念和原理,而且深入探讨了计算机设计的各个方面,包括指令集设计、微体系结构设计、逻辑设计和实现等。读完这本书,我对计算机体系结构有了更为全面和深入的认识。......
  • 基于振弦采集仪的工程结构振动监测及分析
    基于振弦采集仪的工程结构振动监测及分析基于振弦采集仪的工程结构振动监测及分析是一种常用的结构健康监测方法。这种方法通过在工程结构上安装振弦采集仪,采集结构的振动数据,然后对数据进行分析和处理,以评估结构的健康状况。振弦采集仪是一种能够实时采集结构振动数据的仪器。......
  • 偏置归纳:神经网络的偏置归纳由什么构成?网络结构?权重参数值?—— 由网络结构和权重参数
    本文记录一个机器学习的一个理论知识:神经网络的偏置归纳由什么构成?网络结构?权重参数值?答案:由网络结构和权重参数值共同决定。参考:https://www.jianshu.com/p/e4c18f6538d2这个问题问的好像很小白,但是这个知识点其实很多人都是搞不大懂的。其实机器学习算法可以分为有参......
  • C语言基本结构快和概念
    C语言包含了许多基本构建块和概念,下面是一些主要的部分:基本数据类型:整型(int)、字符型(char)、浮点型(float)、双精度浮点型(double)。派生类型,如数组、指针、结构体、联合体、枚举。运算符:算术运算符(如+,-,*,/)。关系运算符(如==,!=,<,>)。逻辑运算符(如&&,||,!)。位运算符(如&,|,^,......
  • DNA mRNA结构
    DNA结构 及其与mRNA的关系  Pre-mRNA到成熟mRNAProteinCodingRegion=CDS    ......
  • 计算机网络之网络协议和体系结构(一)
    1.网络协议的三要素什么是协议?为了保证通信正常进行,必须事先做一些规定,而且通信双方要正确执行这些规定,例如,使用哪种基带编码方式,差错编码和交换技术等。同时,只有双方在这些规定上达成一致,彼此才能能够互相“理解”,从而确保通信的正常进行。这种通信双方必须遵守的规则和约定成为协......
  • 循环结构
    for循环基本语法细节说明while循环基本语法细节说明do-while循环基本语法细节说明多重循环介绍应用案例(打印空心三角)......