内存
存储器
存储数据的器件
外部存储器
长期存放数据,掉电不丢失数据。
常见的外存数据:硬盘、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.对应类型的指针变量,只能存放对应类型的变量的地址。
指针变量的定义
1.简单的指针变量
数据类型 * 指针变量名
int * p; //定义了一个指针变量p
在定义指针变量的时候,*是用来修饰变量的,说明变量p是个指针变量。
变量名是p。
2.关于指针的运算符
& 取地址 、 * 取值
例:
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<stdio.h>
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;
}
3.指针大小
#include<stdio.h>
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<stdio.h>
int main()
{
int a = 0x1234abcd;
int* p;
p = &a;
printf("&a=%p\n", &a);
printf("p=%p\n", p);
return 0;
}
指针的分类
按指针指向的数据类型来分
1.字符指针
字符型数据的指针
char* p; //定义了一个字符指针变量,只能存放字符型数据的地址编号
char ch;
p = &ch;
2.短整型指针
short int* p;
short int a;
p = &a;
3.整型指针
int* p;
int a;
p = &a;
注:多字节变量,占多个存储单元,每个存储单元都有地址编号,
c语言规定,存储单元最小的那个编号,是多字节变量的地址编号。
4.长整型指针
long int* p;
long int a;
p = &a;
5.float型指针
float* p;
float a;
p = &a;
6.double型指针
double* p;
double a;
p = &a;
7.函数指针
8.结构体指针
9.指针的指针
10.数组指针
11.通用指针 void*
总结:无论什么类型的指针变量,在32位系统下都是4个字节,在64位系统下是8个字节。指针只能存放对应类型的变量的地址编号。