戴维营第八天上课总结

结构体是一个类似超级数组一样的定义, 它可以定义许多不同类型的变量, 用struct 加上变量名, 类似于int a这样子的定义, 但区别在于结构需要用{};等三个符号来概括包含里面的内容, 定义好之后, 可在main函数中直接调用, 用(.)或者(->)两个运算符进行调用.

struct book
{
    char titleP[MAXTITL]
    char author[AXAUTL]
    float value
}library;

上面这样子就是帮结构体book起一个别名叫做library, 在main函数当中我们也可以直接使用library, 还有另外一种声明方法.

struct
{
    char titleP[MAXTITL]
    char author[AXAUTL]
    float value
}library;

这样子写法就是一开始可以不用给结构体定义变量名, 到最后面的时候直接给结构体起另一个别名library, 这样子可以省略一个命名的步骤.

下面就是结构题的使用方法

#include <stdio.h>
#include <string.h>
#define MAXTITL 41  //书名的最大长度+1
#define MAXAUTL 31  //作者名的最大长度+1
struct book     //结构模板: 标记book
{
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

int main(int argc, const char * argv[]) {
    struct book library;    //把library声明为book类型的变量
    printf("Please enter the book title.\n");

    gets(library.title);    //gets是bug的存在, 容易溢出, 一般不推荐使用
    //scanf("%s",library.title);    //访问title部分
    printf("Now enter the author.\n");

    gets(library.author);   //gets是bug的存在, 容易溢出, 一般不推荐使用
//    scanf("%s",library.author);
    printf("Now enter the value.\n");

    scanf("%f", &library.value);
    printf("%s by %s: $%.2f\n", library.title, library.author, library.value);
    printf("%s: \"%s\"($%.2f)\n", library.author, library.title, library.value);
    printf("Done.\n");
    return 0;
}

C程序内存地址空间布局

1,文本短(.text:可执行的指令)

2.数据段

初始化数据段(全局变量, 静态变量)

非初始化数据段

初始化数据段需要我们自己定义, 运行之前就代入进去.

非初始化数据段是由系统在程序运行的时候代入进去的

3.栈(stack) 由系统自己分配

数据是先进后出(或者是后进先出)

a.局部变量

b.函数调用时返回地址

c.调用着的环境信息

4.堆(heap)需要我们自行分配释放管理(普通的局部变量)

由我们自己分配释放管理, 如果我们不去释放, 程序结束时才会由系统自动回收.

程序中的malloc, calloc, realloc等函数都是分配内存. 由小的空间向大的空间分配, 堆是从下向上分配.

时间: 2024-10-20 10:51:03

戴维营第八天上课总结的相关文章

戴维营第二天上课总结

今天珊哥讲解了进制的转换, 以及C语言的32个关键字, 然后我自己尝试算了一道进制的转换题目 二进制转换十进制 1010 = 1*2^3+0*2^2+1*2^1+0*2^0 = 10 十进制转二进制 10 = 10/2 余数0   5/2  余数1   2/2  余数0 1/2  余数1 1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) 4 { 5 int a = sizeof(int); 6 printf(&qu

戴维营第六天上课总结

今天珊哥给我们讲解了预处理,宏定义, 数组, 以及画图, 宏定义.... 编译预处理:对源程序进行编译之前所作的工作,它由预处理程序负责完成.编译时,系统将自动引用预处理程序对源程序中的预处理指令进行处理. 预处理指令:以“#”号开始的指令. #define是宏定义, 在main函数之前定义函数的类型数据, 默认只可控制单行, 但是可以用续行符'\'进行多行续行,如果需要取消宏定义在main的应用,可以使用#undef对下列的函数取消#define定义的参数. #define R /* #und

戴维营第三天上课总结

今天轮到大茶给我们讲课, 给我们更加详细的讲解各个数据类型, 以及其他关键字, 并且给我们演示怎么用代码编写一个计算器, 还有怎么算闰年, 左移等等知识点, 其中的代码有 #include <stdio.h> int main(int argc, const char * argv[]) { int16_t y = 14, m = 9, d =17; int16_t data = 0; //y<<9 // 0000 0000 0000 1110 // 0001 1100 0000

戴维营第七天上课总结

今天的内容是关于字符串, 指针, 数组这些问题, 要知道在C语言中是没有为字符串定义一个类型的, 只有用char[]的数组类型的方式存储字符串, 打印的时候使用%s 打印, 指针呢, 变量的地址称为指针, 而存储变量的称为指针变量, 指针也是一种变量. 用*加变量名设定变量. 指针的运算操作分为三种: 第一:对指针变量或者是指针变量组成的表达式进行运算. 第二:是间访操作. 第三:间访操作后对数组的元素进行计算. 数组:

戴维营第五天上课总结

今天大茶给我们讲了C语言的递归以及函数的调用, 函数的调用, 可以在其他文件中创建函数的源文件, 在main文件中进行调用, 可以节俭在main函数的多行代码, 一旦程序出错, 调试起来也非常的方便, 不需要在一大段的代码中慢慢寻找一些细小的错误. 递归的使用有些类似于循环, 一样有判断语句, 当判断语句不成立的时候, 跳过判断语句的条件, 进行到else语句进行递归运算, 一直到不满足条件为止. #include <stdio.h> int f(int n); int n; int main

戴维营第四天上课总结

今天大茶继续给我们讲解C语言的知识点, 以及注意事项, 由于没有基础, 所以学习进度非常的慢, 虽然有很多东西都难以理解, 但越是难以理解, 编程的魅力就越大, 哪怕是我只会让电脑输出一个hello, 我也是成就感十足, 编程世界的魅力难以抗拒, 今天大茶给我们布置了一道题目, 以我的能力, 我暂时写不出来, 所以我自己想了一些小题目来锻炼自己的逻辑思维能力, 以下就是我今天的代码 int row = 5, column = 5; //先设定行数和列数 for(int i = 0; i <= r

第一天上课有感

怎么说呢,总的感觉有点很神奇的,昨天刚来咨询,今天就进入了这期学员的培训课,时间紧凑而又很有规律性,感觉有点拍电影被人设计好了情节一样,一环接一环,但确确实实的存在了我的生活中,可能也是在按时这是我的一次机遇吧.上午听了试听课,对这一块内容有了粗略的认识,也消除了心理的陌生感,原来编程是这么回事,也简单的了解了java,.net.和php之间的差异性,可能这一块对以后自己选择方向提供了帮助.总的来说,今天上午听了试听课,自己动手操作了一下,认为自己也是可以承受这方面的挑战的,下午的时间听了李老说

Java基础第八天听课总结(2)--多线程&Thread

进程 在任务管理器中查看进程,应用程序对应一个进程 进程之间的内存是隔离的,进程间是通过套接字通信Socket通信 什么是线程? ------------------------------ 线程是程序执行过程中,并发执行的代码段 线程之是可以共享内存. 线程的执行是从上往下按序执行的. 创建线程方式一 继承Thread 子类覆盖中的run方法,将线程执行的代码存放在run中 建立子类对象的同时线程也被创建. 通过调用start方法开启线程 Thread是线程类 start() //通知CPU可

第三个Sprint冲刺第八天

第三个Sprint冲刺第八天