以下内容为本人看“传智播客”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;
//*号放在右边,取内存的值,读内容