C语言入门-7.结构体与C++引用

结构体-结构体对齐-结构体数组

结构体的定义、初始化、结构体数组

C语言提供结构体来管理不同类型的数据组合。

cs 复制代码
#include <stdio.h>

struct student{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
};//结构体类型声明,注意最后一定要加分号

int main() {
    struct student s = {1001,"ali",'M',20,99,"Shanghai"};
    struct student sarr[3];//定义一个结构体数组变量
    int i;
    //结构体输出必须单独去访问内部成员
    printf("%d %s %c %d %5.2f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
    printf("--------------------------");
//    scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);
    for(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);
    }
    for(i = 0;i <3;i++){//结构体数组的输出
        printf("%d %s %c %d %.2f %s\n",sarr[i].num,sarr[i].name,sarr[i].sex,sarr[i].age,sarr[i].score,sarr[i].addr);
    }
//    printf("%d %s %c %d %f %s",s.num,s.name,s.sex,s.age,s.score,s.addr);
    return 0;
}
//输出
1001 ali M 20 99.00 Shanghai
--------------------------
2000 lilil M 22 63 Shanghai
3025 dave F 22 36 Beijing
5362 dliv F 23 32 Hangzhou
2000 lilil M 22 63.00 Shanghai
3025 dave F 22 36.00 Beijing
5362 dliv F 23 32.00 Hangzhou

Process finished with exit code 0

❗ 如果结构体变量已经定义,那么只能对它的每个成员变量单独赋值,如s.nun = 1003;

结构体对齐

👩‍💻 结构体的大小必须是其最大成员的整数倍!

为什么要对齐?为了CPU高效的去取内存上的数据

cs 复制代码
#include <stdio.h>

struct student_type1{
    //double是一种浮点类型,8个字节,浮点分为double和float
    double score;
    short age;//short是整型,占2个字节
};

struct student_type2{
    double score;
    int height;//如果两个小存储之和是小于最大长度8,那么它们就结合在一起
    short age;
};

struct  student_type3{
    int height;
    char sex;
    short age;
};
//结构体对齐
int main() {
    struct student_type1 s1;
    struct student_type2 s2;
    struct student_type3 s3;
    printf("s1 size = %d\n", sizeof(s1));
    printf("s2 size = %d\n", sizeof(s2));
    printf("s3 size = %d\n", sizeof(s3));
    return 0;
}
//输出
s1 size = 16
s2 size = 16
s3 size = 8

结构体指针与typedef的使用

结构体指针

一个结构体变量的指针就是该变量所占据的内存段的起始地址。指针变量也可以用来指向结构体数组中的元素,从而能够通过结构体指针快速访问结构体内的每个成员。

cs 复制代码
#include <stdio.h>

struct student{
    int num;
    char name[20];
    char sex;
};
//结构体指针
int main() {
    struct student s = {100,"alli",'M'};
    struct student sarr[3]={1001,"zhangsan",'F',2500,"lisi",'M',6322,"qiaorv",'M'};
    struct student *p;//定义结构体指针
    p = &s;
    printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);//方式一通过结构体指针去访问成员
    printf("%d %s %c\n",p->num,p->name,p->sex);//优先使用
    p = sarr;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    printf("-------------------------------------\n");
    p = p + 1;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    return 0;
}
//输出
100 alli M
100 alli M
1001 zhangsan F
-------------------------------------
2500 lisi M

typedef的使用

cs 复制代码
#include <stdio.h>
//stu 等价于 struct student,pstu等价于 struct student*;
typedef struct student{
    int num;
    char name[20];
    char sex;
}stu,*pstu;

typedef int LLLL;//特定地方使用

//typedef的使用
int main() {
    stu s = {1001,"wangle",'M'};
    stu *p = &s;//定义了一个结构体指针变量
    pstu p1 = &s;//定义了一个结构体指针变量
    LLLL num = 10;
    printf("num = %d,p -> num = %d\n",num,p -> num);
    return 0;
}
//输出
num = 10,p -> num = 1001

C++引用

C++的引用

对于C++,首先新建源文件时,名字需要叫main.cpp,以cpp后缀结尾

在子函数内修改主函数的普通变量的值

cpp 复制代码
#include <stdio.h>
//C++引用
//在子函数内修改主函数的普通变量的值
//当在子函数中要修改主函数中的值,就用引用
void modify_num(int &b){//形参中写&,要称为引用
    b = b + 1;
}

int main() {
    int a = 10;
    modify_num(a);
    printf("after modify_num = %d\n",a);
    return 0;
}
//输出
after modify_num = 11

在子函数内修改主函数的一级指针变量

cpp 复制代码
#include <stdio.h>

void modify_pointer(int *&p,int *q){
    p = q;
}
//子函数内修改主函数的一级指针变量
int main() {
    int *p = NULL;
    int i = 10;
    int *q = &i;
    modify_pointer(p,q);
    printf("after modify_pointer = %d\n",*p);
    return 0;//进程已结束,推出代码为-1073741819,不为0,那么代表进程异常结束
}
//输出
after modify_pointer = 10

Process finished with exit code 0

C++的布尔类型

cpp 复制代码
#include <stdio.h>

int main() {
    bool a = true;
    bool b = false;
    printf("a = %d,b = %d\n",a,b);
    return 0;
}
//输出
a = 1,b = 0
相关推荐
我们的五年3 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
-一杯为品-8 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
程序猿阿伟19 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Lenyiin1 小时前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝2 小时前
C/C++内存管理
java·c语言·c++
fhvyxyci2 小时前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string