c 指针基础
指针变量的运算
为什么指针是强类型?
具有类型系统,指针在解引用的时候才知道需要读取几个字节的信息,这样子才能从内存地址中获取正确完整的信息。
算术操作
指针进行特定类型的算术操作的情况
- *(p + 1):该地址没有赋值,所以是一个随机数
- *p0:将 int 类型转换为 char 类型的指针后,机器在读取值的时候会只读取一个字节的内容,即(00000001),所以是 1
*(p0 + 1):指向的内容地址就是(00000100)的内容,所以是 4
指向指针的指针
总的来说就是,要指向一个指针就需要在变量前面多加一个 * 号
函数传值 VS 传引用
由上图可知,c 中的函数传值,属于值拷贝,形参的内存地址和原本变量的内存地址不同,所以不会影响到原本的变量。
原本外层函数调用其他函数时,最新的那个函数会置于栈帧的顶部,在执行完成后,会被推出清空。
指针和数组
数组做为函数参数
数组做为函数参数是传引用,指向的是数组的第一个元素的内存地址
上图就是每次传递数组时需要顺带传递数组长度的原因指针和二维数组
int(*p)[3] = B
:为什么要写上 [3],这里体现了类型指定对于指针的重要性,B 是一个二维数组,数组在内存中是一个连续的空间,而 B 这个二维数组的第二维是指定 3 块内存空间的,指针只有带上这个数在解析的时候机器才能知道需要一次性解析多少内存空间指针和多维数组
指针和动态内存
函数指针