码迷,mamicode.com
首页 > 其他好文 > 详细

第一章 必须厘清的核心概念

时间:2015-06-02 00:21:18      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:

一、堆栈

  栈,按照先进先出的原则存储数据,栈底固定,栈顶浮动,也被称为先进后出表。在i386机器中,栈顶由esp的寄存器进行定位,压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大。栈在程序的运行中有着举足轻重的作用,栈保存了一个函数调用时所需要得维护信息这常常被称为堆栈帧。栈一般包含以下两方面的信息:

  1)函数的返回地址和参数

  2)临时变量:包括函数的非静态局部变量及编译器自动生成的其他临时变量

  堆,是一种动态存储结构,实际上就是数据段中的自由存储区,常用于存储、分配动态数据。堆和栈在使用时“生长”方向相反,栈向低地址方向“生长”,而堆向高地址方向“生长“。回顾一下寄存器的几个知识点:

  1)push操作先移动栈顶指针,之后将信息入栈

  2)esp为堆栈指针,栈顶由esp寄存器来定位,压栈的操作使栈顶的地址减小,弹出的操作使栈顶的地址增大

  3)ebp是32位的bp,是基址指针。bp为基址指针寄存器,用它可直接存取堆栈中的数据,他在调用函数时保存esp,以便函数结束时可以正确返回。

  4)默认的函数内存变量压栈操作位:从上到下、从左到右,采用4字节对齐。数组的压栈方法略有不同,即从最后一个元素开始,知道起始元素为止,即采用从右向左的方法压栈。

(待补充)

 

二、生存期和作用域

  所谓生存期是指变量占用内存或者寄存器的时长,根据变量存储类别的不同,在编译的时候,变量将被存放到动态存储区或静态存储区中,所以生存期是由声明时的存储类别所决定的。

  1)静态存储区:存放全局变量和静态变量,在执行程序前分配储存空间,占据固定的存储单元,一般情况下会对其进行初始化

  2)动态存储区:存放的时函数里的局部变量、函数的返回参数、形参等,它在函数被执行的过程中进行动态分配,在执行完该函数时自动释放。由于分配的区域是不固定和不可预测的,初始化的代价太高,故一般都未初始化

  存储类别分为四种:1、自动变量(auto) 2、寄存器变量(register)3、静态变量(static)4、外部变量(external)

 

三、指针数组和数组指针

int _tmain(int argc, _TCHAR* argv[])
{
	int arr[4][4] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
	int(*p1)[4];
	int *p2[4];
	int i,j,k;
	printf("使用数组指针:\n");
	p1 = arr;
	for(i = 0;i <4;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("arr[%d][%d] = %d\t", i, j, *(*(p1+i)+j));
		}
		printf("\n");
	}

	printf("使用指针数组:\n");
	for(k=0; k<4;k++)
	{
		p2[k] = arr[k];
	}
	for(i = 0;i <4;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("arr[%d][%d] = %d\t", i, j, *(p2[i]+j));
		}
		printf("\n");
	}

}

四、位域

(待补充)

第一章 必须厘清的核心概念

标签:

原文地址:http://www.cnblogs.com/cauchy007/p/4545235.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!