如果做一个计算机或者设计一个可以简单计算思考的东西 如何设计
可以通过回忆一个计算算式的过程思考你需要哪些东西
- 读题
- 笔
- 纸
- 写计算草稿
- 记录运算中间值
- 大脑的计算
- 写出答案
然后我们想这样一个问题在上面我用了哪些工具
- 笔
- 纸
- 文字和数字符号
如果我不用这些工具, 大脑需要多处理什么内容?
记忆部分
计算机也是工具
冯诺依曼体系结构

计算机中如何存放数据
申请空间放入数据
我们看到一个东西一眼就有一个简单的印象, 这个部分是大脑后台帮助我们自动处理好了, 我们感觉不到实际上
指针是什么
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。
下图是 4G 内存中每个字节的编号(以十六进制表示):
我们将内存中字节的编号称为地址(Address)或指针(Pointer)。地址从 0 开始依次增加,对于 32 位环境,程序能够使用的内存为 4GB,最小的地址为 0,最大的地址为 0XFFFFFFFF。
指针在计算机语言技术发展的过程中是必然出现的一个产物, 相对于今天来讲也是旧时代的一个产物, 但是在今天依然有着强大的功能, 同时也有使用风险
加深理解: 一切都是地址
计算机的任何操作, 都是事先写好的, 那么这些实现写好的东西都放在硬盘里面, 然后再载入到内存之中。 内存很大如何去找这些位置呢? 地址。 那么指针就是
C语言用变量来存储数据,用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用。
数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。
指针就是一个数据, 指针也需要地址
c语言中指针的定义
定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号,格式为:
datatype name;
或者
datatype *name = value;
//定义普通变量float a = 99.5, b = 10.6;char c = '@', d = '#';//定义指针变量float *p1 = &a;char *p2 = &c;//修改指针变量的值p1 = &b;p2 = &d;
可以连续定义
int *a, *b, *c; //a、b、c 的类型都是 int*
区分这两种定义
int *a, b, c;
通过指针变量取得数据
#include <stdio.h>
int main(){
int a = 15;
int *p = &a;
printf("%d, %d\n", a, *p); //两种方式都可以输出a的值
return 0;
}

也就是说,使用指针是间接获取数据,使用变量名是直接获取数据,前者比后者的代价要高。
指针除了可以获取内存上的数据,也可以修改内存上的数据
#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;。
