第一章 认识指针

C程序的内存使用形式

内存方式 作用域 生命周期
全局内存 整个文件 应用程序生命周期
静态内存 声明函数内部 应用程序生命周期
自动内存 声明函数内部 函数执行生命周期
动态内存 由引用该内存的指针决定 内存释放(人工)

全局内存:常见的全局变量 静态内存:静态变量,例如const int var 自动内存:常见的就是生命在函数体内的变量了,这是最常见的 动态内存:通过指针创建的堆区域

常量与指针

指针类型 指针是否可修改 指针指向数据是否可修改
指向非常量的 指针( int * ptr )
指向 常量的 指针( const int * ptr )
指向非常量的常量指针( int * const ptr )
指向 常量的常量指针( const int * const ptr )

阅读指针声明的时候,采取从右往左读的方式。

* pci - pci是个指针

int * pci - pci是个指向整数的指针

const int * pci - pci是个指向整数常量的指针,(指针可变,指针指向区域的整型数据不可变)

  • int const * pconst 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)
  • 通过程序显示的地址均为在操作系统虚拟内存映射下的地址,并非真正的物理地址
  • 在取地址和解地址的方面,*&是互反的操作
  • 在使用指针时,NULL0都可以,但是NULL更好些,可以告诉开发者在使用指针。
  • void指针是通用指针。void指针可以转换为除函数指针外的任何指针。
  • intprt_tuintptr_t是C99标准为了适应64位环境所新增的。暂时可以不用了解
  • 指针相加的实质是按声明类型字节大小进行步增
  • 指针相减的实质是两个指针地址相减后,按声明类型字节大小整除后得到的单位值,并通过符号老判断地址前后顺序

results matching ""

    No results matching ""