C提高1

以下内容为本人看“传智播客”C++基础教程完整版视频所做的笔记

程序的内存四区模型

栈区(stack):程序局部变量,系统给分配空间,函数结束后空间自动给回收,在函数里面写的变量都在栈区
堆区(heap):程序员手动分配空间 malloc/new free/delete
全局区:全局变量,静态变量,文字常量区

代码区:操作系统管理

例子:

#include "stdafx.h"

char *get_str1()
{

	char *p = "abcdef";//"abcdef放在全局区中的文字常量区
	return p;
}

char *get_str2()
{

	char *q = "ghijkl";//"ghijkl放在全局区中的文字常量区
	return q;
}

char *get_str3()
{

	char *k = "abcdef";//"abcdef放在全局区中的文字常量区
	return k;
}

int main()
{
	char *p = NULL;
	char *q = NULL;
	char *k = NULL;

	p = get_str1();
	q = get_str2();
	k = get_str3();
	//%s:指针指向内存区的内容
	//%d:指针P本身的值
	printf("p=%s,p=%d\n",p,p);
	printf("k=%s,k=%d\n", k,k);
	printf("q=%s,q=%d", q, q);

	printf("\n");
	system("pause");
    return 0;
}

编译结果如下:

  • 注:因为在函数get_str1()和get_str3()中指针p和k都指向的内存全局区中"abcdef",所以p和k的值(即常量"abcdef"的地址)是一样的。

栈区分析

注意函数体中的局部变量系统将其放在内存的栈区,所以函数调用结束后内存将释放。

比如调用完语句:(如下)

p = get_str();    //get_str()返回的是数组变量str[]

结束后,str[]中的值将被释放,那么指针p所指向的str[]中的数将为乱码如果此时调用语句:

printf("p = %S\n",p);

则调试结果如下:


堆区分析

用动态分配内存空间函数malloc()
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

使用方法如下代码,这样就不会造成调用完函数内存空间就被释放的结。

#include "stdafx.h"
#pragma warning(disable:4996)  //用strcpy()时须用此条语句
char *get_str()
{
	char *temp = (char *)malloc(100);
	if (temp == NULL)
	{
		return NULL;
	}
	const char a[] = "ahsfdh";
	strcpy(temp, a);
	return temp;
}

void main()
{

	char *p = NULL;
	p = get_str();
	if (p != NULL)
	{
		printf("p = %s\n", p);
		free(p);
		p = NULL;//因为free(p)的作用只是将指针p指向堆区的关系释放出来,
		         //以允许其他指针可以指向堆区,但指针p此时仍指向堆去,所以要将p的值赋为空
	}
	

	system("pause");
}

测试结果如下:


指针是一种数据类型

数据类型的本质是固定内存大小快
32位的程序指针都是占4个字节

指针变量也是变量,它可以保存数据如:

*p =0x11//指针变量*p的值为0x11

通过*号操作内存

在函数中以下几条语句说明了如何用*号操作内存

int a = 100;
int *p = NULL;
//指针指向谁,就把谁的地址赋值给指针
p = &a;
//*钥匙,通过*可以找到指针指向的内存区域,操作还是内存
*p = 22;
//*号放在左边,给内存赋值,写内容
int b = *p;
//*号放在右边,取内存的值,读内容

发布了25 篇原创文章 · 获赞 4 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章