考研C语言第八章

这篇具有很好参考价值的文章主要介绍了考研C语言第八章。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构体定义,初始化,结构体数组

结构体对齐

考研C语言第八章
这个东西看着像数据库里面属性的定义,也像java里面的类的定义

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

struct student{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
};

int main()
{
    struct student s={1001,"lele",'M',20,85.4,"shenzhen"};
    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
    scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);
    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
    return 0;
}

关于结构体里面scanf读取输入的数据,并进行相关的存储,
这里面字符串就像之前的,取数据时可以和前面的不加空格,可以不加取地址符号
(但是为了好记和规范,建议直接所有的一视同仁)
考研C语言第八章
就想数据库在输入数据的时候也每一列数据都需要读入,不然容易写入异常或者失败,一个意思
考研C语言第八章
结构体数组练习:

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

struct student{
    int num;
    char name[20];
    char sex;
    int age;
    float score;
    char addr[30];
};

int main()
{
    struct student arr[3];
    for(int i=0;i<3;i++)
    {
        scanf("%d %s %c %d %f %s",&arr[i].num,&arr[i].name,&arr[i].sex,&arr[i].age,&arr[i].score,&arr[i].addr);
    }
    for(int j=0;j<3;j++)
    {
        printf("%d %s %c %d %f %s\n",arr[j].num,arr[j].name,arr[j].sex,arr[j].age,arr[j].score,arr[j].addr);
    }
//    struct student s={1001,"lele",'M',20,85.4,"shenzhen"};
//
//    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
//    scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);
//    printf("%d %s %c %d %f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
    return 0;
}

考研C语言第八章
计算结构体对齐:(例题很复杂)
考研C语言第八章
在这个例题里面结构是:
63+3+2
其中63是:int是4个字节,char数组20个,char一个,int 四个float四个,char30三十个
4+20+1+4+4+30=63个
在这里我们的结构体是相对于int char float这些类型,不是针对于数组的(也就是本题的20,30)
本来63是针对于一个字节整除,现在最大成员是4(int 和float的)从一个变成四个需要加三
63+3
然后前五个属性没有问题了,看最后一个char30
30不能整除4,需要变成32才能整除4
所以需要+2
63+3+2=68
考研C语言第八章
为什么要结构体对齐?CPU高效的去读取内存上的数据
详见机组
上面的图,本来一次只能读四个字节,但是先放了1个字节的数据之后,又放了20个字节的数据,就把20个字节拆开了,本来读取五次就可以完全读取完毕,但是现在最后还余一个,不完整

下面还有几个例题:
考研C语言第八章
double是8个,short是2个
8+2=10,但是还要按照8进行对齐
16
考研C语言第八章
double 8 int 4 short 2
8+4+2=14还是按照8
16
(ps:老师说4个字节和2个字节是可以堆在一起的,就可以只看8)
考研C语言第八章
int 4 char 1 short 2 4+1+2=7
按照四个字节凑,8

结构体指针,typedef

考研C语言第八章

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

struct student{
    int num;
    char name[20];
    char sex;
};

int main()
{
    struct student s={1001,"wangle","M"};
    struct student arr[3]={1001,"lilei","M",1005,"zhangsan","M",1007,"lili","F"};
    struct student *p;
    p=&s;
    printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);
    return 0;
}

(*p).num这么写的原因是.的优先级比**的优先级高,所以需要加个括号
但是很显然这个不方便

printf("%d %s %c\n",p->num,p->name,p->sex);

用这一种,箭头的比较方便

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

struct student{
    int num;
    char name[20];
    char sex;
};

int main()
{
    struct student s={1001,"wangle",'M'};
    struct student arr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};
    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=arr;
    //上面这个等价于p=&arr[0];
    return 0;
}

上面有一些没改!!sex的地方必须是单引号,字符串的地方是双引号(严格!)

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

struct student{
    int num;
    char name[20];
    char sex;
};

int main()
{
    struct student s={1001,"wangle",'M'};
    struct student arr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};
    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=arr;
    p=p+1;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    p=p+1;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    p=p+1;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    //上面这个等价于p=&arr[0];
    return 0;
}

每次p+1都是偏移一整个结构体的偏移量,也就是正好是一个学生的全部属性数据

//起别名 stu等价于struct student pstu等价于struct student*
typedef struct student{
    int num;
    char name[20];
    char sex;
}stu,*pstu;

int main()
{
    stu s={0};
    stu *p=&s;//定义了一个结构体指针变量
    pstu p1=&s;//定义了一个结构体指针变量
    return 0;
}

typedef起别名的操作,缩减了代码量

//起别名 stu等价于struct student pstu等价于struct student*
typedef struct student{
    int num;
    char name[20];
    char sex;
}stu,*pstu;
typedef int INGETER;

int main()
{
    stu s={1001,"zhangsan",'M'};
    stu *p=&s;//定义了一个结构体指针变量
    pstu p1=&s;//定义了一个结构体指针变量
    INGETER num=10;
    printf("%d %s %c\n",p->num,p->name,p->sex);
    printf("num=%d\n",num);
    return 0;
}

这里面假如还定义了属性,恰好和结构体里面某个属性重名,就可以用typedef进行替换,这里面是将int替换成了INGETER,这样在输出的时候也不会出错:
考研C语言第八章
8.4开始使用了C++的引用
C++的语法里面新加入的传参数的话需要加取地址符
考研C语言第八章

#include <stdio.h>

void modify_num(int &b)
{
    b=b+1;
}

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

C++语言兼容C语言的代码
上面这段代码假如换成C语言就会变成
考研C语言第八章
在复试解释引用是什么?
在主函数里面需要调用子函数里面的东西,就加引用(取地址)
如果不调用,就不需要加(取地址符)

#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("%d\n",*p);
    return 0;
}

在这里面相当于q知道i的地址,告诉p,关于上面传参数的括号,还是之前的知识点,&p在子函数里面修改了值之后在主函数进行调用,so,p前面加&,q前面不加
(ps:&必须紧紧挨着变量,不能分开)

上面这种写法是避免了二级指针(没听说过,完全蒙圈)
考研C语言第八章
考研C语言第八章
布尔类型
考研C语言第八章
oj作业:
第一题:利用结构体实现读取输入和输出

#include <stdio.h>

typedef struct student{
    int num;
    char name[20];
    char sex;
}stu;
int main(){
    stu s;
    scanf("%d %s %c",&s.num,&s.name,&s.sex);
    printf("%d %s %c\n",s.num,s.name,s.sex);
    return 0;
    
}

要注意的点:初始化,写入和读取空格
第二题:
考研C语言第八章文章来源地址https://www.toymoban.com/news/detail-494763.html

#include <stdio.h>
#include <cstdlib>


void modify_pointer(char *&p)
{
    p=(char*)malloc(100);//申请100个字节大小的空间
    fgets(p,100,stdin);
}
int main(){
    char *p=NULL;
    modify_pointer(p);
    puts(p);
    free(p);//申请的空间之后记得free
    return 0;
}

到了这里,关于考研C语言第八章的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 考研数据结构:第八章 排序

    2.1.1算法思想 插入排序的思想很简单,就是不断的把一个个带排序的记录,按的大小插入到前面已经排好序的子序列中。直到全部序列插入完成。 比如我们现在要对下面的序列进行排序, 刚开始我们从1号位开始 我们会认为当前处理的这个元素之前都是有序的 现在把

    2024年02月11日
    浏览(27)
  • 考研C语言第八章

    这个东西看着像数据库里面属性的定义,也像java里面的类的定义 关于结构体里面scanf读取输入的数据,并进行相关的存储, 这里面字符串就像之前的,取数据时可以和前面的不加空格,可以不加取地址符号 (但是为了好记和规范,建议直接所有的一视同仁) 就想数据库在输

    2024年02月10日
    浏览(27)
  • C语言中结构体初始化并清零的方法有几种?

    结构体初始化清零方法 在C语言中,结构体初始化并清零的方法有以下几种: 手动赋值为0:结构体定义后在函数内手动将每个成员都赋值为0。例如: 使用memset()函数:可以使用  memset()  函数将结构体的所有成员都设置为0。例如: C99标准的方式:C99标准新增了一个特性,可

    2024年02月17日
    浏览(30)
  • 【数据结构】顺序栈和链栈的基本操作(定义,初始化, 入栈,出栈,取栈顶元素,遍历,置空)

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰   目录 ⭐栈的分类 ✨顺序栈 🎈优点: 🎈缺点: ✨链栈 🎈优点: 🎈缺点: ⭐基本概念 ✨栈: ✨栈顶: ✨栈顶: ✨图片理

    2023年04月22日
    浏览(39)
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月25日 V1.0 发布于博客园 目录 目录 单向循环链表公式 初始化单向循环链表 构建单向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 CircularLinkedLis

    2024年04月25日
    浏览(40)
  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(37)
  • C++结构体初始化方法

    在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结。 如果只是想全部初始化为 0 可以按照如下方法 结构体包含数组(数组在结构体变量定义完就初始化为0) 直接赋值的方法虽然很直观,但是如果需要初始化多个结构体变量,

    2024年02月16日
    浏览(37)
  • TabView 初始化与自定义 TabBar 属性相关

    SWift TabView 与 UIKit 中的 UITabBarController 如出一辙.在 TabView 组件中配置对应的图片和标题; 其中,Tag 用来设置不同 TabView 可动态设置当前可见 Tab;另也有一些常用的属性与 UIKit 中的类似,具体可以按需参考 api 中属性进行单独修改定制; 在 iOS 15.0 之后还可设置角标记 .badge 对 TabBa

    2024年02月10日
    浏览(26)
  • go语言数据初始化

    数据的声明: 初始化数组的初始化有多种形式。 [5] int {1,2,3,4,5} 长度为5的数组,其元素值依次为:1,2,3,4,5。 [5] int {1,2} 长度为 5 的数组,其元素值依次为:1,2,0,0,0 。 在初始化时没有指定初值的元素将会赋值为其元素类型 int 的默认值0,string 的默认值是 “”。

    2024年02月03日
    浏览(37)
  • C语言字符串初始化详解:用常量字符串进行字符数组初始化

    简介 字符串初始化 用常量字符串 初始化过程 示范代码 结论 在C语言中,字符串被定义为字符数组。字符串的初始化是指将一个常量字符串复制到字符数组中。本文将详细介绍字符串的初始化方法,并提供相应的示范代码。 在C语言中,有几种常用的方法可以用常量字符串来

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包