本帖最后由 稳稳の幸福 于 2017-4-27 20:14 编辑
C程序的内存使用形式内存方式 | 作用域 | 生命周期 | 全局内存 | 整个文件 | 应用程序生命周期 | 静态内存 | 声明函数内部 | 应用程序生命周期 | 自动内存 | 声明函数内部 | 函数执行生命周期 | 动态内存 | 由引用该内存的指针决定 | 内存释放(人工) |
全局内存:常见的全局变量 静态内存:静态变量,例如const int var 自动内存:常见的就是生命在函数体内的变量了,这是最常见的 动态内存:通过指针创建的堆区域 常量与指针[td]指针类型 | 指针是否可修改 | 指针指向数据是否可修改 | 指向非常量的 指针( int * ptr ) | 是 | 是 | 指向 常量的 指针( const int * ptr ) | 是 | 否 | 指向非常量的常量指针( int * const ptr ) | 否 | 是 | 指向 常量的常量指针( const int * const ptr ) | 否 | 否 |
阅读指针声明的时候,采取从右往左读的方式。 * pci - pci是个指针 int * pci - pci是个指向整数的指针 const int * pci - pci是个指向整数常量的指针,(指针可变,指针指向区域的整型数据不可变)
- int const * p与const int * p是等价的。可以按上面那种方式来读取。const * p是指向常量的指针,int const * p是指向整型常量的指针。
- int * const p是与上面不同的,const p意味着是常量,* const p则是常量指针,int * const p是指向整型的常量指针(指针不可变,指针指向区域的整型数据可变)
- 结合上面两种的形式是const int * const * p就是指针不可变,指针指向区域的数据也不可变
指针多层引用- 多层指针通常与多维数组,指针数组等有关联,详细的放到第四章 数组与指针中进行详细记录
其他- 指针的语法和语义规范
- 指针的声明:声明指针时,例如int * p,*的位置是无所谓的,看个人习惯。
- &用来取值,%p来显示地址。
- 各平台显示地址方式不一定会一致。通过将要显示的指针转换为void指针来兼容各个平台,例如print("p%",(void *) p)
- 通过程序显示的地址均为在操作系统虚拟内存映射下的地址,并非真正的物理地址
- 在取地址和解地址的方面,*和&是互反的操作
- 在使用指针时,NULL和0都可以,但是NULL更好些,可以告诉开发者在使用指针。
- void指针是通用指针。void指针可以转换为除函数指针外的任何指针。
- intprt_t和uintptr_t是C99标准为了适应64位环境所新增的。暂时可以不用了解
- 指针相加的实质是按声明类型字节大小进行步增
- 指针相减的实质是两个指针地址相减后,按声明类型字节大小整除后得到的单位值,并通过符号老判断地址前后顺序
|