指针学习笔记(二)
程序栈
程序栈是支持函数执行的内存区域,通常和堆共享。程序栈通常占据这块区域的下部,二堆则是用上部。
栈帧
程序栈存放栈帧,栈帧存放函数的参数和局部变量。堆管理动态内存。
栈帧由一下元素组成:
- 返回地址
函数完成后要返回的程序内部地址
- 局部数据存储
为局部变量分配的内存
- 参数存储
为函数参数分配的内存
- 栈指针和基指针
运行时系统用来管理栈的指针
栈指针通常指向栈顶部,帧指针通常存在并指向栈帧内部的地址。
函数指针
函数指针是持有函数地址的指针。
void(*foo)(); //void为返回类型;foo为函数指针变量的名字;()存放参数。
传递函数指针:把函数指针声明作为函数参数
返回函数指针:把函数返回的类型声明为函数指针
数指针数组:把函数指针声明为数组类型,函数指针数组可以基于默写条件选择要执行的函数
比较函数指针:用相等和不等操作比较函数指针
NULL与NUL
NULL用来表示特殊指针,通常定义为((void*)0)
NUL是一个char,定义为\0
字符串字面量池
字面量*:用双引号引起来的字符序列,常用来进行初始化,位于字符串字面量池中
定义字面量时通常会将其分配在字面量池中,这个内存区域保存了组成字符串的字符序列,一般字面量分配在只读内存中是不可变的。字符串字面量不存在作用域的概念。
字符串内存分配
char *globalheader = "Chapter";
char globalArrayHeader[] = "Chapter";
void displayHeader()
{
static char* staticHeader = "Chepter";
char *localHeader = "Chapter";
static char staticArrayheader[] = "Chepter";
char localArrayHeader[] = "Chepter";
char *heapHeader = (char*)malloc(strlen("Chepter")+1);
strcpy(heapHeader,"Chapter");
}