C语言指针知识点总结目录一、指针功能二、基础概念1. 地址2. 指针3. 指针变量三、指针两大运算符1. 取地址运算符2. * 取值解引用运算符四、指针变量定义野指针空指针指针类型含义五、指针两种操作含义六、指针算术运算七、函数参数值传递与地址传递1. 值传递2. 地址传递指针传参八、一维数组与指针关系数组名特性一维数组作为函数形参的写法三种等价形式一、指针功能让程序代码更加简洁高效能够直接访问内存空间二、基础概念1. 地址计算机为区分内存中不同存储空间对内存进行编号存储空间对应的编号就是地址。内存按照字节进行编址。寻址范围0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF2. 指针指针本质上可以理解为地址指针带有类型属性类型决定了它指向空间占用字节大小。3. 指针变量专门用来存放指针地址的变量称为指针变量日常也会直接简称为指针。三、指针两大运算符1. 取地址运算符仅左值支持操作常量、表达式等右值无法进行取地址。变量运算结果该变量在内存中存储空间的首地址。类型转换规则类型升级例如int→int *。示例intnum0;num;// 获取变量num内存首地址2. * 取值解引用运算符只有指针类型的数据可以执行*操作普通变量不能直接解引用。*指针运算结果从指针保存的首地址开始读取对应类型长度的数据。类型转换规则类型降级例如int *→int。若*指针放在等号左侧充当左值代表向指针指向的内存空间写入数据。四、指针变量定义语法格式数据类型 *变量名;int*p;char*p;float*p;double*p;int*p,*q;在64位系统中所有指针变量统一占用8字节和指针指向的数据类型无关。野指针未经初始化、或者指向已经被释放内存空间的指针。规范禁止使用未初始化的野指针。空指针指向内存地址0x0位置的指针使用NULL表示。int*pNULL;0x0地址对应的内存空间为只读禁止对空指针解引用*p否则程序直接崩溃。指针类型含义指针的数据类型决定指针指向何种类型内存空间int *p指向int类型空间char *p指向char类型空间float *p指向float类型空间double *p指向double类型空间五、指针两种操作含义假设有指针变量pp代表操作指针变量本身修改它可以改变指针指向的地址。*p代表操作指针指向的内存空间修改它只会修改地址内存储的值不会改变指针指向。示例区分inta100;intb200;int*pa;int*qb;pb;// 修改指针p本身p指向变量bpq;// 修改指针p本身让p和q指向同一空间*pb;// 修改p指向空间内的数据指针指向不变*p*q;// 修改p指向空间内的数据指针指向不变六、指针算术运算支持、-、、--p向内存高地址偏移偏移长度 指针指向数据类型的字节大小p--向内存低地址偏移偏移长度 指针指向数据类型的字节大小*p等价于*p , p先取值再移动指针两个同类型指针可以相减计算得到两个地址之间相隔多少个对应类型元素。注意指针不支持相加运算七、函数参数值传递与地址传递1. 值传递实参将数值副本传递给形参形参发生修改不会影响外部实参。适用场景函数只需要读取外部变量数值不需要修改变量。2. 地址传递指针传参实参把变量地址传递给指针形参函数内通过解引用可以直接修改外部实参的值。适用场景函数内部需要修改函数外部变量借助地址传递实现一个函数返回多个结果八、一维数组与指针关系inta[5]{1,2,3,4,5};int*pNULL;pa[0];pa;// 数组名a等价于数组首元素地址等价关系a[n] *(an) *(pn) p[n]数组名特性数组名是指向数组首元素的指针常量不能被直接赋值修改。绝大多数场景数组名可看作对应类型指针如int数组名看作int *两种例外sizeof(数组名)此时数组名代表整个数组不视作指针数组名取出整个数组的地址不视作普通元素指针C语言中[]本质是指针语法糖p[n]等价于*(pn)。一维数组作为函数形参的写法三种等价形式intfun(intarray[],intlen);intfun(intarray[5]);intfun(int*parray,intlen);数组传入函数后会隐式转化为指针函数内部无法通过sizeof获取数组总大小必须额外传入数组长度。