1. c语言中的数组作为形参时编译器都会把它当成指针处理,所以在对数组进行操作的时候,通常还需要再加个一个形参,那就是数组长度,因为数组的结束没有标志,需要程序员自己进行判断。

    2.引入数据类型是为了更容易地表达现实生活中的人和事,数据类型本质就是固定大小的一段内存空间,常见的数据类型的所占字节大小如下:

    • int: 4 字节
    • char: 1 字节
    • float: 4 字节
    • double: 8字节
    • long: 4 字节
    • 指针: 4 字节

  2. 当有一个数组 b,打印 b+1&b+1 是不同的,这是因为他们的数据类型不一样,前者代表的是这个数组的首个元素的地址,后者表达的是数组的最后一个元素的地址,所以 &b 表达的是整块数组的地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

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

    int main(void)
    {
    int b[] = {1,2,5,3,8,9,4};
    printf("b = %d, b + 1 = %d, &b = %d, & b + 1 = %d\n", b, b+1, &b, &b+1);
    system("pause");
    return 0;
    }

    # 结果是:
    b = 7338172, b + 1 = 7338176, &b = 7338172, & b + 1 = 7338200


  1. return 不是把内存块的字节 return 出来,而是把内存快的首地址返回。


  1. 判断栈是开口向上还是向下,利用栈后进先出的特性可以通过先后定义两个变量继而打印他们的地址来知道开口的方向,先存的变量的地址小就说明开口是向上的,反之就是向下的,有一个需要注意的 是,存放数组时,他的每一个元素的地址都是递增,也就是说都是开口向上的,这个说明不了栈的开口!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # include<stdio.h>
    # include<stdlib.h>

    int main(void)
    {
    // 两个变量先后被压进栈,通过判断地址可以判断栈的开口
    int a;
    int b;
    printf("&a=%d, &b=%d\n", &a, &b); // 通过debug方式编译是开口向下的,通过release编译则是向下的
    system("pause");
    return 0;
    }

    结果:
    &a=13630336, &b=13630340 // 可以看到开口是向上的


  1. 函数调用模型: 一般都是先将该函数的地址压入栈,然后就是将其参数压入栈,接着才是将其代码压入栈,如果该函数调用了别的函数,执行到了,就会将该函数的运行状态压入栈,然后再将被调用的函数地址压入栈,接着重复上述过程。

  2. c语言中,内存区一般分为四个区,分别是:

    • 栈:存放的是局部变量,程序运行结束之后就会被操作系统自动释放
    • 堆: 存放的是动态创建的变量,不能自动释放,需要程序员手动释放
    • 全局区: 又名静态区,存放的是全局变量以及静态变量,还存放一些常量,比如字符串常量和其他常量,该区域还是等待程序结束后操作系统释放内存,但和栈不同的是,他里的所被分配的内存可以被之前的函数给调用
    • 代码区: 存放我们所写的代码。


第一天就这么多啦,每天进步一点点就足够!


今天还学到一个鼓励自己的方法: 每当自己学不进去的时候,就去知乎看看,你会发现,原来你自己什么都不会!毕竟知乎里的都是大牛。然后你就会马上滚回来学习了