|
发表于 2024-3-3 17:13:35
|
显示全部楼层
本帖最后由 tzz1983 于 2024-3-3 17:20 编辑
简单点来理解, C语言的指针包含两个信息:
1. 地址
2. 这个地址存放了什么类型的数据
指针类型 实际上是指针指向的地址存放的数据的类型, 比如字符型指针, 整形指针.
指针自身的宽度 和硬件相关, 比如 51内核的IDATA最多256字节, 8位足够表示所有地址 (idata *)指针自身的宽度是8位.
不同类型指针之间的强制转换规则 地址不变, 指向的数据类型改变. 比如 int a=0x3355; int * pt=&a; char b = *((char *)pt); //结果是 b=0x33; 地址不变, 因为C51是高字节存在前面, 只读1字节char 即读到的数据是0x33
指针是一个二进制的地址, 所以任何指针都可以转换为整形数据, 前提是整形的宽度容得下指针. 反过来 整形亦可转换为指针, 比如 int *pv = 0x3366;
有两种特殊的指针:
1. void* 指针, 这种指针只包含地址, 没有说明这个地址上放的是什么类型的数据, 所以用这个指针前要先转换为有类型的指针再使用, 接上例 void * p = &a; 如果直接 int c =*p; 编译器报错, 编译器表示我不知道地址P内存的是什么数据. 正确的语句是 int c = *((int*)p);
2. 函数指针. 函数经编译器编译过后就是一段汇编代码, 代码需要存在ROM内, 所以函数也是有地址的. 函数指针就是指向函数的指针, 函数除了有地址外, 还有形参格式, 所以函数指针也包含这类信息. 比如定义函数指针时, 需要用这样的书写格式:
int (*f) (int x); /* 声明一个函数指针 */ 即声明指针的同时,也要声明形参格式.
|
|