内存的存储
1、是以一个字节为一个编号,也就是8位合在一起给一个编号,不是0,1就给编号。内存分为很多个单元,每个单元就会分配一个编号。
地址
内存单元的一个编号。而指针和地址一个概念的。也就是说指针就是地址。
- 内存单元的编号,是一个从0开始的非负整数
- 范围:cpu对内存是通过控制、数据、地址三条总线来进行控制的。
![](https://guardwhy.oss-cn-beijing.aliyuncs.com/img/C/Array/03.png)
控制总线:
cup会先把内存中的数据读入,进行处理后,在返回给内存,然后内存在把数据写入硬盘。
数据总线:
用于数据的传输,不管是把内存中的数据发送给cpu,还是把cpu的数据写如内存条,都是由数据线来完成的,但是数据传输的方向则是由控制线来控制的。
地址总线:
地址线则是确定数据要写入内存中的那个单元。所谓的一个单元就是一个字节。
一条地址总线能控制2的1次方,一般的机器有32个地址线,最终能够控制2的32个单元,而每个单元是八位,而最终我们的内存能够存储2的32次方*8位。
变量
1、普通变量:只能存放一个值。
2、指针变量:同样是一个变量,但是指针变量存放其他变量的地址
代码示例
#include <stdio.h>
int main() {
int num = 10;
//需求:定义一个指针变量p 保存num的地址编号
//定义中:*修饰p为指针变量 指针变量名为p 而不是*p
int *p;
//将指针变量p 与num建立关系
p = #
char ch = 'a';
//需求:定义一个指针变量p1 保存ch的地址编号
char *p1;
//ch与p1建立关系
p1 = &ch;
return 0;
}
图示:
![](https://guardwhy.oss-cn-beijing.aliyuncs.com/img/CSS/指针01.png)
指针变量的使用
代码示例1
# include <stdio.h>
int main(void)
{
int * p; //p是变量的名字, int * 表示p变量存放的是int类型变量的地址
/*
int * p; 不表示定义了一个名字叫做*p的变量
int * p; 应该这样理解: p是变量名, p变量的数据类型是 int *类型
所谓int * 类型 实际就是存放int变量地址的类型
*/
int i = 3;
int j;
/*
1. p保存了i的地址, 因此p指向i
2. p不是i,i也不是p,更准确的说: 修改p的值不影响i的值,修改i的值也不会影响p的值.
3. 如果一个指针变量指向了某个普通变量, 则*指针变量就完全等同于普通变量
例子:
如果p是个指针变量,并且p存放了普通变量i的地址,则p指向了普通变量i。
*p 就完全等同于i,或者说:在所有出现*p的地方都可以替换成i。
在所有出现i的地方都可以替换成*p,*p 就是以p的内容为地址的变量。
*/
p = &i;
j = *p; //等价于 j = i;
printf("i = %d, j = %d\n", i, j);
return 0;
}
解析
p的内容是一个地址,在代码中,p的内容就是i的地址,*p其指向的变量当然就是i变量了。
注意
1、*p代表的是p所指向的那个变量。在上代码中*p和i是同一个东西,但是*p和p不是同一个东西。
2、int* p是一个声明,开头的int*是他的数据类型。P是变量的名字。不能理解我定义了一个整形变量,这个整形变量的名字叫做*p。所谓int*类型,实际就是存放int变量地址的类型。
3、*p代表的是以p的内容为地址的变量。
代码示例2
# include <stdio.h>
int main(void)