指针学习
一.指针的本质
- 指针的使用场景----传递和偏移
1.定义
-
左边是虚拟地址,都是???,没有给你用
-
把妹纸的地址存下来,就需要指针变量
-
CPU只能访问到字节,不能访问到位
-
int* p;
-
int *p,a; //p是指针变量,a是int型
-
指针变量是一种特殊的变量,只能存放地址
-
指针的本质就是为了实现间接访问.
-
取地址操作符&又称引用,获取一个变量的地址值
-
取值操作符*又称解引用,得到一个地址对应的数据
-
地址就是指针
二.指针的使用场景—传递和偏移
1.传递
- 函数的调用是值传递
2.偏移
- 对指针的加减,+就是向后偏移,指向下一个元素;同理-.
- 指针变量加1后,偏移的长度是其基类型的长度,就是偏移sizeof(int),这样通过*(p+1),就可以得到a[1]
- 数组名里存的就是指针
- *(p+2)=p[2]
3. 指针与自增自减运算符
- 在这里的a不能换成arr.因为数组定义时相当于arr已经和地址绑定了
- (),[]的优先级比后++高
4. 指针与一维数组
- 一维数组名中存储的就是数组的首地址
5.指针与动态内存申请
- size_t:字节
6. 字符指针和字符数组
- 字符串常量是放在数据区的常量区的,好处是相同的字符串只用存储一次,常量区的字符串不能修改
- 字符数组c在栈空间有10字节大小的空间
- p是一个指针变量,我们可以重新将一个地址赋给它
- 但数组名c本身存储的就是数组的首地址,相当于符号常量,因此不能给c重新赋地址
- 函数执行结束,栈空间会被释放,堆空间不会,堆空间要自己释放
- 返回值要和类型一致才行
- 野指针
- 分手过后,要彻底忘记NULL
7. const
- const char *ptr
- const放在前面,代表不能用ptr区修改它指向的空间的内容去
- char * const ptr
不能修改const指针,但可修改该指针的内容
8.memcpy函数与memmove函数的差异
三.数组指针和二维数组
- 数组指针还是指针,占4个字节(类别:整型指针,字符指针)
- 指针数组存放了四个指针元素,占16字节(类比一下:整型数组,字符型数组,指针数组)
- 任何数组名都是存了一个地址
- b[4],b是整型指针,&b是数组指针
- 二维数组数组名中存放的是数组指针,&b+1,偏移了一个数组长度
- 对整型指针取值得到整型1,2,3…
- 对数组指针取值得到数组a[1],a[2]…
- 一维数组a[1]是数组名,本身也是指针,可再次进行偏移
- 任何变量取地址+1,指向其所占空间的末尾
四.二级指针
- 二级指针指服务于一级指针
- 二级指针的偏移
- 服务于指针数组
- int a[5],整型数组,每个整型元素占4个字节
- int *p[5],指针数组,每个指针元素占sizeof(int *)*5=20个字节
- 场景:商品排序
- 指针数组是数组,只是其中存了5个指针
- 一维数组的数组名就是一级指针
- 让每个指针指向字符串常量区的每个字符串
- 放在下面是把 字符串常量区的每个字符串往栈空间copy
五.函数指针
- 函数名里存的就是函数入口地址