C语言指针:从基础到应用
1. 内存地址与变量顺序
在编程中,我们需要关注变量在内存中的相对位置。编译器对变量在内存中的排序可能与我们的声明顺序不同。例如,即使 pDimension
是最后声明的,它可能拥有最低的内存地址;而最先声明的 height
可能处于较高的内存地址。这意味着我们不能预知编译器如何在内存中排列变量,所以应始终使用命名的内存位置(变量)。
我们可以做一个实验,在编译程序时,将所有的 %2lu
和 %#lx
替换为 %d
(先将程序复制到另一个文件,再在副本上进行实验)。
2. 理解 void*
类型
在某些情况下,指针的类型是未知的,这在C库函数中较为常见。 void*
指针类型代表一个通用的、尚未指定的指针,即声明时不知道其类型的指针。任何指针类型都可以赋值给 void*
类型的指针变量,但在访问该指针变量之前,必须通过强制类型转换操作指定要访问的数据类型。
以下是一个示例代码:
void* aPtr = NULL; // 我们还不知道它指向什么
...
aPtr = &height; // 它有了height的地址,但还没有类型
...
int h = *(int*)aPtr; // 通过强制类型转换,我们可以访问该地址并获取一个整数值
在上述代码中