指针
指针=>内存地址
指针变量=>存储着内存地址的变量
定义格式:
数据类型*变量名 (数据类型要跟指向的数据类型保持一样)
指针作用
1.查询数据
int a=10;
int* p=&a;
printf("%d\n",*p);2.存储数据/修改数据
*p=200;
printf("%d ",*p);3.参数传递
4.内存管理
指针的作用
1.操作其他函数中的变量
2.函数返回多个值
3.函数的结果和计算状态分开
4.方便的操作数组和函数
指针步长
是指通过指针进行递增或递减操作时,指针所指向的内存地址相对于当前地址的偏移量
指针的步长取决于所指向的数据类型
指针的使用细节:
1.指针变量的名字
int*p
名字为p,不是*p2.数据类型要跟指向的变量类型保持一样
3.指针变量占用的大小,跟数据类型无关,跟编译器有关
32位:4字节
64位:8字节
4.给指针变量赋值的时候,不能把一个数值赋给指针变量
指针的运算
有意义的操作
指针跟整数进行加,减操作(每次移动N个步长)保证:内存空间是连续的 //数组
指针跟指针进行减操作(间隔步长)
无意义的操作指针跟整数进行乘除操作
原因:此时指针指向不明指针跟指针进行加,乘,除操作
指针的类型
指向不明的指针野指针:指针指向的空间未分配
悬空指针:指针指向的空间已经分配,但是被释放了
没有类型的指针
特殊类型:
void*p 不表示任何类型特点:无法获取数据,无法计算,但是可以接收任意地址
二级指针
int**p
作用1:利用二级指针修改一级指针里面记录的内存地址
作用2:利用二级指针获取到变量中记录的数据
数组指针指向数组的指针,就是数组指针
实际上指向的是数组首元素的地址数组指针的细节
arr参与计算的时候,会退化为第一个元素的指针特殊情况:
sizeof运算的时候,不会退化,arr还是整体
&arr获取地址的时候,不会退化(步长==数组类型*数组长度)
指针数组
存放指针的数组 作用:用来存放指针
举例: int*p[5],这个数组里面存放这int类型的指针函数指针
格式:
返回值类型 (*指针名) (形参列表)
作用:
利用函数指针,可以动态调用函数指针函数(返回值是指针)
c语言允许函数的返回值 是一个指针 (地址),这样的函数称为 指针函数
格式:
返回值类型 * 函数名(形参列表){
函数体
}
函数体中的 return 命令返回一个地址
void指针
C语言中,一共有几种指针类型,其中最特别的就是void *指针。
void *指针就是指向任何类型的指针, 在编译的时候不会确定其指向的类型,是在程序中进行指向的。 这种类型的指针 不能直接进行取内容或递增递减的操作.必须先转成 别的类型的指针才可以执行,否则报错空指针NULL
NULL空指针 注意区分大小写
指一个指针不指向任何地址,我们称之为空指针,
NULL是一个值为0的宏常量
标签:语言,指向,int,函数,数组,类型,指针 From: https://blog.csdn.net/2403_89181725/article/details/144580355
- 变量的指针。
- 浮点型指针(float*, double*):指向浮点型变量的指针。
- 字符型指针(char*):指向字符或字符串的指针。
- 数组指针与指针数组:
- 数组指针(如int (*p)[10]):指向一个包含10个整数的数组的指针。
- 指针数组(如int* arr[5]):一个数组,其元素是指向整数的指针。
- 函数指针:
- 函数指针(如int (*p)(int, int)):指向一个接收两个整数参数并返回一个整数的函数的指针。
- 特殊指针:
- 字符串常量指针(如char* ps = "abcdef";):指向字符串常量的指针,但应注意字符串常量本身是只读的。
- 指针常量(如int* const p):指针的值(即它指向的地址)不可变。
- 常量指针(如const int* p):指针指向的值(即该地址处的数据)不可变。
- 常指针常量(如const int* const p):既不可修改指向的地址,也不可修改指向地址的值。
- 多级指针:
- 二级指针(如int** p):指向指针的指针。
- 三级指针、四级指针等:以此类推,指向更高级别指针的指针。
- 其他特殊指针:
- 野指针:未初始化的指针或已经释放但未被置为NULL的指针。
- 空指针(NULL或nullptr):不指向任何有效内存地址的指针。
- 结构体和联合体的指针:
- 结构体指针(如struct A* p):指向结构体类型的指针。
- 联合体指针(如union B* q):指向联合体类型的指针。