c 指针基础

image.png

指针变量的运算

image.png

为什么指针是强类型?

具有类型系统,指针在解引用的时候才知道需要读取几个字节的信息,这样子才能从内存地址中获取正确完整的信息。

image.png

算术操作

指针进行特定类型的算术操作的情况
image.png
image.png

  • *(p + 1):该地址没有赋值,所以是一个随机数
  • *p0:将 int 类型转换为 char 类型的指针后,机器在读取值的时候会只读取一个字节的内容,即(00000001),所以是 1
  • *(p0 + 1):指向的内容地址就是(00000100)的内容,所以是 4

    指向指针的指针

    总的来说就是,要指向一个指针就需要在变量前面多加一个 * 号
    image.png

    函数传值 VS 传引用

    image.png
    由上图可知,c 中的函数传值,属于值拷贝,形参的内存地址和原本变量的内存地址不同,所以不会影响到原本的变量。
    image.png
    原本外层函数调用其他函数时,最新的那个函数会置于栈帧的顶部,在执行完成后,会被推出清空。
    image.png

    指针和数组

    数组所占用的内存地址是连续的
    image.png
    另一种写法
    image.png

    数组做为函数参数

    数组做为函数参数是传引用,指向的是数组的第一个元素的内存地址
    image.png
    image.png
    上图就是每次传递数组时需要顺带传递数组长度的原因

    指针和二维数组

    image.png
    image.png
    image.png
    image.png
    image.png
    image.png

  • int(*p)[3] = B:为什么要写上 [3],这里体现了类型指定对于指针的重要性,B 是一个二维数组,数组在内存中是一个连续的空间,而 B 这个二维数组的第二维是指定 3 块内存空间的,指针只有带上这个数在解析的时候机器才能知道需要一次性解析多少内存空间

    指针和多维数组

    image.png
    image.png

    指针和动态内存

    image.png

    函数指针

    image.png
    image.png