1.内存四区
- 代码区:代码。
- 全局区:全局的常量。
- 栈区:系统自动开辟,自动释放。
for(int i=0;i<n;i++)
其中的i属于栈区,使用完自动释放,内存空间较小。 - 堆区:动态开辟,手动开辟,手动释放,在学数据结构的时候,接触的malloc就是手动开辟内存空间,内存空间较大。
2.地址
把内存以1个字节为单位。地址的1000是随便写的,但1001,1002是依次递增的。
说到地址,不得不说c语言的取地址运算符&,通过&就可以知道变量在内存中的首地址。
#include <stdio.h>
int main(){
int a;
printf("%d",&a);
}
运行结果:
运行结果的解释:变量a在内存中的地址为6487580。
3.首地址
一段内存空间中第一个存储单元的地址。
- 如果定义了一个
char a[5]
,其中a[0]
的地址就是首地址; - 如果定义了一个
int a[5]
,其中int占据4个字节的大小,首地址就是a[0]
在内存空间里的第一个存储空间的地址,假如a[0]
的存储空间为1000,1001,1002,1003,则首地址为1000。 - 数组同理
4.指针指针变量
指针:地址。
指针变量:用来存放地址的变量。
(1)指针变量的引用
数据类型 *变量;
//定义一个指针变量p,存的是地址!
//int 指明指针指向的数据类型
//* 指明p这个变量是一个指针变量
int *p;
(2)指针变量的赋值
int a;
int *p; //* 只是表明指针p是一个指针变量
p = &a; //指针里存放的是a的地址
(3)指针变量的引用
//1.使用变量名
printf("a=%d",a);
//2.指针访问
//*为取值运算符,返回某一地址中的值。
printf("a=%d",*p);
(4)实例
现在假设有一个 char 类型的变量 c,它存储了字符 ‘K’(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示)。另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们就称 p 指向了 c,或者说 p 是指向变量 c 的指针。
代码表示为:
char c = 'k';
char *p;
p = &c;
(5)好习惯
//int *p; p里面保存的地址不确定,p的指向是不明确的。可能为重要数据。
int *p=NULL;
5.指针变量的运算
+,-,++,-- 指针偏移,去访问地址旁边的一些内存。
指针变量的偏移,以指针所指向的类型空间为单位进行偏移。