存储数据的器件
长期存放数据,掉电不丢失数据。
常见的外存数据:硬盘、ROM、U盘
暂时存储数据,掉电丢失
常见的内存数据:ram、DDR
物理内存
实实在在的存储设备。
虚拟内存
操作系统虚拟出来的内存。
32bit 32根寻址总线
0x00 00 00 00
0xff ff ff ff
操作系统会在物理内存和虚拟内存之间做映射。
在32位系统下,每个进程(运行中的程序)的寻址范围是4G
0x00 00 00 00 ~ 0xff ff ff ff
在运行程序的时候,操作系统会将虚拟内存进行分区如下:
1.堆
在动态申请内存的时候,在堆里开辟内存。
2.栈
主要存放局部变量(在函数内部,或复合语句内部定义的变量)。
3.静态全局区
1):未初始化的静态全局区
静态变量(定义的时候加static修饰),或全局变量,没有初始化的,存在此区。
2):初始化的静态全局区
全局变量、静态变量、赋过初值的存放在此区。
4.代码区
存放程序代码
5.文字常量区
存放常量
内存是以字节为单位来存储数据的,可以将程序中的虚拟寻址空间,看成一个很大的一维字符数组。
系统给虚拟内存的每个存储单元分配了一个编号,0x00 00 00 00 ~ 0xff ff ff ff,称之为地址。指针就是地址。
指针变量:用来存放地址编号的变量。
在32位平台下,地址总线是32位的,所以地址是32位编号,指针变量是32位即4个字节。
注意:
1.无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,即任何类型的指针变量都是4个字节大小。
2.对应类型的指针变量,只能存放对应类型的变量的地址。
数据类型 * 指针变量名
int * p; //定义了一个指针变量p
在定义指针变量的时候,*是用来修饰变量的,说明变量p是个指针变量。
变量名是p。
& 取地址 、 * 取值
例:
int a = 0x1234abcd;
int *p;
p = &a; //把a的地址给p赋值,&是取地址符。
p保存了a的地址,也可以说p指向了a。
p和a的关系分析:a的值是0x1234abcd,假如a的地址是:0xbfe89869
int num;
num = *p;
分析:
1.在调用的时候 *代表取值的意思,*p就相当于p指向的变量,即a
2.故 num = *p 和 num = a 效果是一样的。
3. num的值为 0x1234abcd。
如果在一行中定义了多个指针变量,每个指针变量前面都需要加 * 来修饰
int *p,*q; //定义了两个整型的指针变量p和q
int *p,q; //定义了一个整型指针变量p,一个整型变量q
#include
int main()
{int a = 100, b = 200;int* p_1, * p_2 = &b;p_1 = &a;printf("a=%d\n", a);printf("*p_1=%d\n", *p_1);printf("b=%d\n", b);printf("*p_2=%d\n", *p_2);return 0;
}
#include
int main()
{char* p1;short int* p2;int* p3;long int* p4;float* p5;double* p6;printf("sizeof(p1)=%d\n", sizeof(p1));printf("sizeof(p2)=%d\n", sizeof(p2));printf("sizeof(p3)=%d\n", sizeof(p3));printf("sizeof(p4)=%d\n", sizeof(p4));printf("sizeof(p5)=%d\n", sizeof(p5));printf("sizeof(p6)=%d\n", sizeof(p6));return 0;
}
#include
int main()
{int a = 0x1234abcd;int* p;p = &a;printf("&a=%p\n", &a);printf("p=%p\n", p);return 0;
}
按指针指向的数据类型来分
字符型数据的指针
char* p; //定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch;
p = &ch;
short int* p;
short int a;
p = &a;
int* p;
int a;
p = &a;
注:多字节变量,占多个存储单元,每个存储单元都有地址编号,
c语言规定,存储单元最小的那个编号,是多字节变量的地址编号。
long int* p;
long int a;
p = &a;
float* p;
float a;
p = &a;
double* p;
double a;
p = &a;
总结:无论什么类型的指针变量,在32位系统下都是4个字节,在64位系统下是8个字节。指针只能存放对应类型的变量的地址编号。