指针
一.指针是什么?
1.了解指针要先知道什么是内存
内存就是电脑上的存储设备,一般是4/8/16G(运行内存)
而平时说的528gb/1tb的是硬盘
程序运行的时候会加载到内存中,也会使用内存空间
内存被分为一个一个的小格子(小房间),一个格子为一个内存单元大小为一个字节,有自己单独的编号
只要知道内存编号就能找到内存单元
内存编号在生活中叫做地址,在c语言中叫做指针
2.int a=10
&a——对a取地址,取出a的地址
a是一个整型变量,占四个字节,每个字节都有地址,&a取出的是第一个字节的地址(较小的地址)
int* pa=&a (pa就被称为指针变量)
指针变量是一种变量,是专门用来存放地址的
应用:
指针(地址)的大小在32位平台是4个字节,在64位平台是8个字节
二.指针和指针类型
因为char类型占1个字节,int类型和float类型占4个字节
2.指针类型决定了指针的步长(指针+1到底跳过几个字节)
字符指针+1跳过一个字节,整型指针+1跳过四个字节
三.野指针(很危险)
概念:野指针就是指针指向的位置是不可知的(随机的,不正确的,没用明确限制的)
野指针成因:
1.指针未初始化
2.指针越界访问
3.指针指向的空间释放
这里打印p的地址的时候test函数的局部变量已经销毁了,所以打印出来的将不是10
如何避免野指针?
1.指针初始化
2.小心指针越界
3.指针指向空间释放,及时置NULL
当不知道指针指向什么地址时,这样初始化指针:
此时指针不能直接用,应该这样写
4.避免返回局部变量的地址
5.指针使用之前检查有效性
四.指针运算
1.指针±整数
这个代码就是把values这个数组全部变成0
2.指针-指针
前提:两个指针要指向同一个空间,且两指针类型应该相同
指针-指针的绝对值得到的是两个指针之间的元素个数
列:
这个代码运行的结果是9
这个代码运行的结果是-9
应用:写一个判断字符串长度的函数
原始方法:
用指针-指针来写:
五.指针的关系运算(比较大小)
可以往后越界去比较,不能往前越界去比较
六.指针和数组
1.指针和数组是不同的对象
指针是一种变量,存放地址的,大小4/8字节的
数组是一组相同类型元素的集合,是可以放多个元素的,大小是取决于元素个数和元素的类型的
2.数组的数组名是数组首元素的地址,地址是可以放在指针变量中
可以通过指针访问数组
七.二级指针
是什么?
解应用操作:**ppa=*pa=a
作用:存放一级指针的地址
八.指针数组
指针数组就是存放指针的数组
概念:
应用:使用一维数组,模拟一个二维数组