文章目录
  1. 1. 1. 理解c指针
  2. 2. 2. 总结

1. 理解c指针


个人感觉要想理解指针就必须要理解内存是如何分配的,否则也不算是真的弄懂了吧!
1.内存分配

  • 静态存储区
    在程序编译的时候就已经分配好了,在程序的整个运行期间都存在,比如全局变量、static,还有常量(字符串常量等)

  • 和Java感觉是一样的,主要就是函数的内部内存,包括函数内部的函数和局部变量,一般自上而下的顺序进行进栈出栈,
    一个指令运行完了就出栈回到分支的主干,这部分内存随着自己的生存期进行回收,大多都是函数执行完毕,
    这部分内存也就随之释放

  • 也叫动态内存分配,这里为了和java堆联系。这部分内存与自己管理,自己进行分配,自己进行回收,
    内部通过空闲内存链表进行分配

2.指针

  • 字面意思:一段数据或者程序的指示
    它代表着他们的入口地址,如果程序中直接用他们的地址进行操作,那么场景就会很混乱,可能一不小心,
    整个程序的内存地址就都混乱了,所以需要有个东西存储他们的内存地址,进行间接操作,也可以通俗的理解成指针即地址
  • 简单理解
    例如:整形指针 int * p; int a = 0;先初始化一个地址 p = a;
    意义再于,从这个指针指向的位置开始的四个字节(int 32位机)解释为一个整数 所以使用指针的时候一定要先初始化
  • 根据优先级和结合方向进行理解
    常用:[](自左向右) > * (自右向左) 分辨指针数组和数组指针
  • 和 指针,根据结合方向,分辨*p++之类的
  • 指针和引用的区别
    • 指针可以地址偏移,引用不可以
    • 指针可以改变指向,引用不可以
    • 引用是某个变量地址的别名
    • 函数参数,若是指针,相当于地址的拷贝;引用的话,就是真的地址传递可以改变地址

2. 总结


1.指针使用之前一定要初始化,即使是NULL,否则使用时候会因为找不到可以进行操作的地址而报段错误
2.全局对象多次使用的情况下,一定要在每次使用之前进行置0恢复初始化状态
3.一定要释放内存,尤其是自己申请的堆内存
4.不要返回指向局部变量的指针或者引用
5.在进行指针偏移的时候一定要清楚偏移的每个单位是多少再进行偏移,否则就有可能指向其他的内存
6.sizeof
sizeof(指针) 就是4 相当于sizeof(char *)
sizeof(数组名) 正常字节
虽然数组名也是数组起始地址,但是在声明的时候就知道数组的内存大小,有办法计算,
但是指针变量在定义的时候是无法知道他的内存大小的,变量!
所以在进行函数参数传递的时候,如果只是传递数组名称的话,就会出现数组退化成为指针的情况,因为这个时候就相当于
是传递了一个地址,所以进行函数参数传递的时候不仅要传递数组名,还要传递数组长度!

文章目录
  1. 1. 1. 理解c指针
  2. 2. 2. 总结