1.内存地址就是一个编号,这些编号都是连续的,称作地址。编号对应的内存以字节为单位划分。
2.内存地址的大小与数据总线的位数有关
3.内存访问分为:直接访问和间接访问
①直接访问:直接访问内存单元中的内容
示例:
int a = 20 ;
对于直接访问,a代表存放数据的内存单元,通过对a赋值或者取值,实现对内存的访问
②间接访问:通过内存单元编号(地址)以及数据所占字节数访问内存中的数据
间接访问在程序中随处可见,通过指针实现内存的间接访问
4.指针:就是地址。内存地址,我们习惯上把内存地址叫做指针。
5.地址:内存编号。内存地址可以简称为地址。“&”查看一个变量的内存地址。“%p”打印地址
6.关键符号:“&”取地址符
7.指针变量:存储内存地址的变量
8.定义指针变量:需要在前面加*
此时 * 仅仅起到表示作用,告诉编译器 p 一个存放 地址 的变量,p是一个指针变量
示例:
int a = 20;
int *p = &a;//(int *)p = &a;
9.取值符号 *
使用 * 号访问内存编号里面对应的内容
示例:
int a = 5;//定义一个整型
int *p = NULL;//定义一个指针变量,地址为空
p = &a;//获取a的地址
printf(“%d”,*p);//*p获取a中的内容
10.给指针变量赋值,意味着指针的重指向
11.指针的类型:
①因为内存地址只跟操作系统有关,所以指针变量所占的内存大小取决于操作位数(32位系统指针占4个字节,64位系统指针占8个字节)
示例:
int *p = NULL;
double *p1 = NULL;
float *p2 = NULL;
long *p3 = NULL;
char *p4 = NULL;
printf(“%lu\n”,sizeof(p));//8个字节
printf(“%lu\n”,sizeof(p1));//8个字节
printf(“%lu\n”,sizeof(p2));//8个字节
printf(“%lu\n”,sizeof(p3));//8个字节
printf(“%lu\n”,sizeof(p4));//8个字节
因为只要是地址,都是8个字节。地址字节数与数据类型无关,数据类型管控从哪开始取,取多少字节。
②int *p 整型指针 double *p 双精度指针 char *p 字符指针
③不同类型的指针,访问的内存大小不一样
12.内存怎么来的
①手动申请(malloc函数)
②系统分配(定义变量的内存空间都是系统分配的)
13.指针变量加减一个常数,指针本身不移动
14.指针变量自增自减,指针移动,地址发生变化。
15.指针类型一定要和指向内存中的数据类型一致。
16.补码:①符号位不变②其他位取反③最后一位加1
17.数组名是一个符号地址常量,不是变量,所以不能自增、自减