内存四区
常见的数据类型
数据类型的本质
从编译器角度理解:
-
数据类型可理解为创建变量的模具(模子);是 固定内存大小 的别名。
-
数据类型的作用:编译器预算对象(变量) 分配 的内存空间大小。
测试数据大小的程序:
//
sizeof是操作符,不是函数;sizeof测量的实体大小为编译期间就已确定
int main()
{
int a = 10;
int b[10] ;
printf("int a:%d \n", sizeof(a));
printf("int a:%d \n", sizeof(int *));
printf("int b:%d \n", sizeof(b));
printf("int b:%d \n", sizeof(b[0]));
printf("int b:%d \n", sizeof(*b));
printf("hello.....\n");
getchar();
return 0;
}
数据类型封装
Ø1、void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
Ø2、用法1:数据类型的封装
intInitHardEnv(void**handle);
典型的如内存操作函数memcpy和memset的函数原型分别为
void*memcpy(void*dest,constvoid *src,size_tlen);
void*memset( void * buffer, intc, size_tnum);
Ø3、用法2: void修饰函数返回值和参数,仅表示无。
如果函数没有返回值,那么应该将其声明为void型
如果函数没有参数,应该声明其参数为void
intfunction(void)
{return1;}
Ø4、void指针的意义
C语言规定只有相同类型的指针才可以相互赋值
void*指针作为左值用于“接收”任意类型的指针
void*指针作为右值赋值给其它指针时需要强制类型转换
int*p1 = NULL;
Char *p2 = (char *)malloc(sizoeof(char)*20);
Ø5、不存在void类型的变量
C语言没有定义void究竟是多大内存的别名
Ø6、扩展阅读
《void类型详解》
数据类型小结
Ø1、数据类型本质是固定内存大小的别名;是个模具,c语言规定:通过数据类型定义变量。
Ø2、数据类型大小计算(sizeof)
Ø3、可以给已存在的数据类型起别名typedef
Ø4、数据类型封装概念(void万能类型)
变量
Ø变量本质:(一段连续)
内存空间的别名
程序的内存四区模型
内存四区模型-建立流程
函数调用模型
函数1调用函数2,函数1称为主调函数 函数2称为被调用函数
规则1:Main(主调函数)分配的内存(在堆区,栈区、全局区)都可以在被调用函数里使用吧。
规则2:在被调用函数里面分配的内存
1
、如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的。
全局区://c++编译器优化
得到的地址是一样的。char *getStr1()
{
char *p = "abcd1";
return p;
}
char *getStr2()
{
char *p = "abcd1";
return p;
}
临时区stack 栈区
char * getStr3()
{
char buf[100];
memset(buf, 0, sizeof(buf));
strcpy(buf, "abcd1");
return buf;
}