一、C/C++理论知识深度剖析系列专题之规划内存四区

本系列主要讲解C/C++的理论,希望对大家有所帮助。

一、规划内存四区

建立正确程序运行内存布局图是学号C的关键
思考:
1、数据类型的引申和思考
2、变量的本质
3、内存的操作

1.1 数据类型的本质分析

1.1.1 数据类型概念

1、“类型”是对数据的抽象
2、类型相同的数据有相同的表达形式、存储格式以及相关的操作
3、程序中使用的所有数据都必定属于某一种数据类型

数据类型图
数据类型的本质思考
数据类型和内存有什么关系?
C/C++为什么会引入数据类型?
从编译器的角度考虑数据类型问题,才会发现他的本质。

1.1.2 数据类型的本质

1、数据类型的理解为创建变量的模具;是固定内存大校的别名。
2、数据类型的作用:编译器预算对象(变量)分配的内训空间的大小

#include<stdio.h>
int main()
{
	int a  = 10;	//告诉编译器,分配4个字节的内存
	int b[10];		//告诉编译器,分配4*10个字节的内存
	printf("%d:%p,b+1:%p,&b+1:%p\n",b,b+1,&b,&b+1);
	//b+1和&b+1的结果不一样,因为b和&b所代表的数据类型不一样
	//b 代表数组首元素的地址
	//&b 代表整体数组的地址
	return 0;
}

1.1.3 数据类型的大小

#include<stdio.h>
int main()
{
	int a = 10;					//告诉编译器,分配4个字节的内存
	int b[10];					//告诉编译器,分配4*10个字节的内存
	b[0] = 1;
	printf("sizeof(a):%d\n", sizeof(a));//分配四个字节
	printf("sizeof(int *):%d\n", sizeof(int *));//64位系统对int指针在内存空间分配8个字节
	printf("sizeof(b):%d,%p\n", sizeof(b),b);	//数组的地址,也是数组的首地址
	printf("sizeof(&b):%d,%p\n", sizeof(&b),&b);//数组指针
	printf("sizeof(b[0]):%d\n",sizeof(b[0]));	//数组首地址中的元素
	printf("sizeof(*b):%d\n", sizeof(*b));		//int型数组首地址元素在内存字节大小 4字节
	getchar();
	return 0;
}

在64位操作系统中上述程序的运行结果如下:
Alt
由此可知,数组的首地址,也就是图中的b在内存中分配了整个数组空间,因此在函数传递时可以只传数组的首地址(此处抛转),后续章节会继续讲解。与此同时,我们同样可以观察出,数组的地址和数组指针地址一样。只有分配的内存空间大小不一样。

1.1.4 数据类型的别名

#include<stdio.h>
/*给结构体起别名*/
struct People
{	
	char name[64];
	int age;
};
typedef struct People
{		
		char name[64];
		int age;
} people_t;
// 数组本身名字为People,别名为people_t
/*给unsigned int */
typedef unsigned int u32;	//给unsigned int 类型取别名
int main()
{
	struct People p1;
	people_t p2;
	u32 a;
	p1.age = 10;
	p2.age = 11;
	a = 10;
	return 0;
}

1.1.5 数据类型的封装

void 的字面意思地“无类型”,void则为“无类型指针”,void可以指向任何类型的数据。
用法1 :数据类型的封装
int InitHardEnv(void **handle);

典型的例如内存操作函数memcpy和memset的函数原型分别为

void * memcpy(void *dest,const void *src,size_t len);
void * memset(void *buffer,int c,size_t num);
用法2:void修饰函数返回值和参数,仅表示无。

如果函数没有返回值,那么应该将其声明为void型
如果函数没有参数,应该声明其参数为void

void function1(void{
	return; 
}
int  function2(void)
{
	return 1;
}
void 指针的意义
C语言规定只有形同类型的指针才可以相互赋值
void*指针作为左值用于“接收”任意类型的指针
void*指针作为右值赋值给其他指针时需要轻质类型转换
void *p1 = NULL;  //此时的p1为空指针
char *p2 = (char *)malloc(sizeof(char)*20); //malloc(sizeof(char)*20)分配内存20个字节大小的空指针,加强制类型转换为char*类型指针,由p2指针接收。
不存在void类型的变量

C语言没有定义void究竟是多大的内存

后续将持续更新》》》》》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值