指针
- 内存中最小的存储单元:字节,每个字节在内存中都有一个编号,这编号就是指针
- 指针:内存地址
- 有了指针你就有了打开这块内存的钥匙,就可以操作这一块的内容了
- 指针变量:存放内存地址的变量
- 定义指针:指针所指的数据类型 * 指针变量名称
- 在定义变量的时候,*表示类型说明符,说明定义的这个变量指针变量
- 使用场景:
- 在被调函数中,通过形参改变主调函数实参的值
- 用于函数返回多个值
多级指针(了解)
指向指针的指针
指针为什么要分数据类型
- 变量的地址是变量所占存储空间的首地址
- 指针变量仅仅可以存储一个地址编号,如果没有类型,当通过指针就不知道要访问多少个字节的存储空间
- 指针区分类型是为了通过 指针访问他所指向的存储空间,能够正确访问
- 如果通过一个char类型的指针操作一个int的变量,如果值的二进制数据超过1字节(char占一个字节,int占4个字节),那么就造成数据错误
- 如果通过一个int 类型的指针操作一个char变量,那么你就会修改了你不该修改的内存,造成程序逻辑错误
指针与一维数组:
数组像一个指针
- nums[1] == p[1]
- nums+1 = p + 1
- nums[1]的本质*(nums + 1)
- 指针 + 整数 ==== 指针的值 + sizeof(所指向的数据类型)*整数
- 数组不是指针
- sizeof(array) != sizeof(pointer);当一个数组赋值给指针变量时候,那么数组中有些信息就丢失了,比如:数组的长度,这种现象指针信息遗失
- 指针的指向可以改变,数组的指向不能改变
- array == &array
指针与二维数组(理解)
- 二维数组的名称为一维数组的地址指针
- 定义指针数组格式
- 数据类型 * 指针变量名称[指针个数]
- *p == p[0]:没有人这么写
- 定义指向一维数组的指针
- int (*ps)[3]
int nums[3][2]和int (*ps)[2]
- ps == nums
nums 和 nums[0]
- 相同点:对应的地址是一样的
- 不同点:指针类型不同
- nums + 1 = nums + sizeof(nums[0]
- nums[0] + 1 = nums + sizeof(int)
- sizeof(nums):二维数组所占用的存储空间字节数