目录
指针概念
指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针指向了这个数据单元,若指针存放的值是0,则这个指针为空指针定义一个指针变量.
指针分类
函数指针 数组指针 指针数组 指针函数
指针定义
1.char *p=&a; 等同于char* p; p=&a;
2.指针的加减通常用于对数组的操作中
数组与指针
数组
数组是一些相同数据类型的变量组成的集合
数组与指针的关系
其数组名即指向该数据类型的指针,及数组名是指向数组首地址的指针
数组的定义等效于申请内存,定义指针,和初始化
注意:
如果定义的是int c[ ]={0X33,0X35,0X35};
对其进行指针操作仍是
*(c+1);指针加一是为了指向下一个数据,实际地址移动了4个字节,偏移量与数据类型有关
指针应用
1.参数传递
值传递
#include <stdio.h>
void fun(int param)
{
printf("%x\n",param);//%x是16进制显示
}
void main()
{
int a = 0x66;
fun(a);
}
代码fun函数会申请一块内存param将传入的a值复制到申请的内存param中,也就是说传给子函数有个数据复制的过程,
值传递隔离了主函数和子函数之间的变量,假如子函数中改变了param的值主函数中a的值不会改变(详细内容看江科大指针55min)
地址传递:
值传递过程中有复制的过程,并且需要额外申请内存,如果传递的数据过大则会占用过大的内存
地址传递过程中子函数和主函数共用同一个地址下的数据,无法进行数据隔离(可以用const(const修饰常量,常量只读不能更改)修饰子函数传递的数组,也可以用全局变量)
详细请看(1h03min)
使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计
可实现多数据进行传递,可弥补return只能返回一个数据
2.传递返回值
传递的是返回的数据地址
将模块内的公有部分返回,让主函数持有模块的“句柄”,便于程序对指定对象的操作I
注意子函数中的局部变量会在子函数执行完之后被释放,所以不能传递被释放的数据地址
3.直接访问物理地址下的数据
访问硬件指定内存下编钩数据,如设备ID号等
将复杂格式的数据转换为字节,方便通信与存储
每个单片机具有全球唯一身份证号码(ID号)
结构体指针
直接引用
直接引用结构体进行同种数据类型的整体赋值
间接引用
用结构体指针引用结构体成员
引用结构体变量的成员一般形式为: (*结构体指针变量) . 成员名
上述间接引用形式比较直观,但略显繁琐.故C语言提供了另一种更加简洁的引用形式:
一般形式: 结构体指针变量->成员名 (此处 -> 称为指向运算符)
其功能等价于: (*结构体指针变量).成员名