如果做一个计算机或者设计一个可以简单计算思考的东西 如何设计

可以通过回忆一个计算算式的过程思考你需要哪些东西

  • 读题
  • 写计算草稿
  • 记录运算中间值
  • 大脑的计算
  • 写出答案

然后我们想这样一个问题在上面我用了哪些工具

  • 文字和数字符号

如果我不用这些工具, 大脑需要多处理什么内容?
记忆部分

计算机也是工具

冯诺依曼体系结构

image.png

计算机中如何存放数据

申请空间放入数据

我们看到一个东西一眼就有一个简单的印象, 这个部分是大脑后台帮助我们自动处理好了, 我们感觉不到实际上

指针 - 图2

指针是什么

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

下图是 4G 内存中每个字节的编号(以十六进制表示):
指针 - 图3

我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。

指针在计算机语言技术发展的过程中是必然出现的一个产物, 相对于今天来讲也是旧时代的一个产物, 但是在今天依然有着强大的功能, 同时也有使用风险

加深理解: 一切都是地址

计算机的任何操作, 都是事先写好的, 那么这些实现写好的东西都放在硬盘里面, 然后再载入到内存之中。 内存很大如何去找这些位置呢? 地址。 那么指针就是

C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。
数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

指针就是一个数据, 指针也需要地址

c语言中指针的定义

定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号,格式为:
datatype
name;
或者
datatype *name = value;

  1. //定义普通变量
  2. float a = 99.5, b = 10.6;
  3. char c = '@', d = '#';
  4. //定义指针变量
  5. float *p1 = &a;
  6. char *p2 = &c;
  7. //修改指针变量的值
  8. p1 = &b;
  9. p2 = &d;

可以连续定义

  1. int *a, *b, *c; //a、b、c 的类型都是 int*

区分这两种定义

  1. int *a, b, c;

通过指针变量取得数据

#include <stdio.h>

int main(){
    int a = 15;
    int *p = &a;
    printf("%d, %d\n", a, *p);  //两种方式都可以输出a的值
    return 0;
}

指针 - 图4

也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。

指针除了可以获取内存上的数据,也可以修改内存上的数据

#include <stdio.h>

int main(){
    int a = 15, b = 99, c = 222;
    int *p = &a;  //定义指针变量
    *p = b;  //通过指针变量修改内存上的数据
    c = *p;  //通过指针变量获取内存上的数据
    printf("%d, %d, %d, %d\n", a, b, c, *p);
    return 0;
}

关于 * 和 & 的谜题

假设有一个 int 类型的变量 a,pa 是指向它的指针,那么&a和&pa分别是什么意思呢?

对星号*的总结

在我们目前所学到的语法中,星号*主要有三种用途:

  • 表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
  • 表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
  • 表示获取指针指向的数据,是一种间接操作,例如int a, b, p = &a; p = 100; b = *p;。