数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
既能读又能写的内存对象,称为变量;若一旦初始化后不能修改的对象则称为常量。
变量本质:(一段连续)内存空间的别名。
内存四区
栈区(stack):也叫临时区,由编译器自动分配释放,存放函数的参数值,局部变量的值等。
堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,该区域在程序结束后由操作系统释放。
常量区:字符串常量和其他常量的存储位置,程序结束后由操作系统释放
程序代码区:存放函数体的二进制代码。
/*
变量生命周期示例
*/
#include "stdafx.h"
#include <stdio.h>
#include<stdlib.h>
/*
访问栈区
*/
int visitStackArea(){
printf("-----------------visitStackArea()---------------------\n");
int a = 10;
printf("a的地址 %d\n",&a);
return a;
}
/*
访问全局区
*/
char* visitGlobalArea(){
printf("----------------visitGlobalArea()----------------------\n");
char *str = "abcdefg";
printf(" visitGlobalArea() str的地址是: %d\n",str);
return str;
}
/*
访问堆区
*/
int* visitHeapArea(){
printf("-----------------visitHeapArea()---------------------\n");
int* chs = NULL;
chs = (int*) malloc(sizeof(int)*10);
for(int i=0; i<10; i++){
*(chs+i) = i;
}
printf(" visitHeapArea() chs的地址是: %d\n",chs);
return chs;
}
int main(){
int a = visitStackArea();
printf("main通过visitStackArea()得到a的值, a的地址是: %d\n",&a);
char* str = visitGlobalArea();
printf("main通过visitGlobalArea()得到str的值, str的地址是: %d\n",str);
int* chs = visitHeapArea();
printf("main通过visitHeapArea()得到的chs的值, chs的地址是: %d\n",chs);
free(chs);
return 0;
}
运行结果:
-----------------visitStackArea()---------------------
a的地址 3209584
main通过visitStackArea()得到a的值, a的地址是: 3209836
----------------visitGlobalArea()----------------------
visitGlobalArea() str的地址是: 20470000
main通过visitGlobalArea()得到str的值, str的地址是: 20470000
-----------------visitHeapArea()---------------------
visitHeapArea() chs的地址是: 7573184
main通过visitHeapArea()得到的chs的值, chs的地址是: 7573184
请按任意键继续. . .
函数调用模型
函数1调用函数2,函数1称为主调函数函数2称为被调用函数。
Main(主调函数)分配的内存(在堆区,栈区、全局区)都可以在被调用函数里使用。
C/C++可以在临时区分配内存,但是用完后被系统清了。
如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的。
要弄清是主调函数分配内存,还是被调用函数分配内存。
主调函数如何使用被调用函数分配的内存(技术关键点:指针做函数参数)。
Heap、stack生长方向和内存存放方向是两个不同概念。