指针
地址:用来区分不同内存空间的一个编号
指针:指针就是地址,地址就是指针,指针多了指向的概念
指针变量:一个用来存放指针(地址)的变量
指针相关运算符
&:获得变量在内存的首地址
- &取地址,只能对变量操作
- &运算符链接表达式的结果为该变量在内存空间的首地址
- &运算符会让类型升级 int -> int* char-> char
* 间接访问操作符
*左值 :将右值放入指针指向的空间;*右值:取地址对应空间的值;
*p = 100; // 左值 * p //右值 num = *p //右值
- *运算符让类型降级 int *-> int char * -> char
- 对int * *获得该运算符开始向下4字节空间,对char * *获得该运算符开始向下1字节空间。
- 只能对指针进行 * 操作
如果* 和& 同时出现,等价于去掉 这两个运算符后的结果
指针变量的定义
int *a; *a = 12;不能这样操作,a的初始值会是个非法地址。
int b= 12; int *a = &b;
等价于 int *a= NULL; p = &b;
在64位操作系统中,所有指针均占8个字节; int * 指向4字节空间
野指针 :未经初始化的指针或指向已经被释放过空间的指针。
不要使用未经初始化的指针
NULL :空指针 指向内存地址为0x0的指针
指针的算数运算
++ :向内存高地址偏移指向数据类型大小个字节空间
-- :向内存低地址偏移指向数据类型大小个字节空间
两个相同类型的指针相减,获得两个地址中间相差了多少个该类型的元素
*p++ 先取 *p 然后 p+ +;
(*p)++ 先取 *p 然后 (* p)+ +;
指针变量本身,也就是p,修改p的值改变指针的指向
指针变量指向的空间 也就是 *p,修改这个值改变的是指针指向空间的值
指针作为函数传参
1.值传递 :实参传值给形参,形参改变,实参不会受影响
2.地址传递:实参将地址给形参,形参是实参的指针,可以通过对形参取 * 改变实参的值
数组与指针的关系
int a[5] = {1,2,4,5}; a = &a[0];
数组的数组名是指向数组第一个元素的指针常量, int* const a 不能改变指向。
int *p = a;
访问数组下标为n的元素a[n] == *(a+n) == *(p + n) == p[n]
指针[偏移量] == *(指针+偏移量)
但此时sizeof(a) 与 sizeof(p) 大小不一样
sizeof(a)返回的是整个数组的字节数 ad的大小是16个字节
sizeof(p) 返回的是指针的大小 8个字节
使用数组传参时
fun(arr[]) sizeof(arr) = 8