首先,我们用一点代码来引入话题
int main(int argc, char *argv[]) {
int a=5,b=10,c=20;
int *p=&b;
printf("a的地址为:%x\n",&a); //十进制:28
printf("b的地址为:%x\n",&b); //十进制:24
printf("c的地址为:%x\n",&c); //十进制:20
printf("***********************\n");
printf("p的地址为:%x\n",&p); //十进制:8
printf("p内保存的地址为:%x\n",p);
printf("*p指向了:%d\n",*p);
printf("*(p+1)指向了:%d\n",*(p+1));
printf("*(p-1)指向了:%d\n",*(p-1));
return 0;
}
从上面的代码我们可以知道在内存中,系统分配的变量地址基本都是连续的,并且间隔大小由变量类型决定。
内存区域如上图所示,由图我们可以知道,内存空间由低到高大致可以分为代码区、常量区、全局(静态)区、堆区、栈区。
- 栈:系统自动分配的空间,只要不特殊声明,就定义在栈区,函数的区域也在栈上。栈是向下增长的(高地址往低地址增长)。(const 在栈里)
- 堆:使用动态内存分配的方式可以申请堆空间,用完要手动释放。
- 全局区:全局变量、静态变量(static)
- 常量区:代码中的数字,字符等常量,例如’a’,—1.2等
- 代码区:存放可执行代码,避免频繁的读硬盘。