指针可以做什么,变量不能做?

Car*_*ars 6 c pointers

我正在学习指针并且已经被告知:"指针的目的是允许你手动,直接访问一块内存."

说我有int var = 5;.我不能使用变量'var'来访问存储值5的内存块,因为我可以随时更改变量的值var = 6;吗?当我只使用其变量访问任何变量的值而不是使用指向存储值的地址的指针时,我真的需要一个指针吗?

Dac*_*den 1

指针类型具有一些使其非常有用的特征:

  1. 确保指针足够大,可以容纳架构支持的任何地址(在 x86 上,即 32 位,即 4 字节,在 x64 上,64 位,即 8 字节)。
  2. 对内存的取消引用和索引是按对象而不是按字节完成的。

    int buffer[10];
    char*x = buffer;
    int*y  = (int*)buffer;
    
    Run Code Online (Sandbox Code Playgroud)

这样,x[1] 就不是 y[1]

int如果您使用简单的s 来保存您的值,则两者都无法得到保证。第一个特征至少由uintptr_t(虽然不是size_t,尽管大多数时候它们具有相同的大小 - 除了size_t在具有分段内存布局的系统上可以是 2 字节大小,而uintptr_t仍然是 4 字节大小)保证。

虽然一开始使用ints 可能有效,但您始终:

  1. 必须将值转换为指针
  2. 必须取消引用指针
  3. 并且必须确保您的“指针”不会超出某些值。对于 16 位 int,你不能超过 0xFFFF,对于 32 位,它是 0xFFFF FFFF - 一旦你这样做,你的指针可能会溢出,而你却没有注意到,直到为时已晚。

这也是链表和指向不完整类型的指针起作用的原因 - 编译器已经知道您要指向的指针的大小,并且只是为它们分配内存。所有指针都具有相同的大小(在 32 位/64 位体系结构上为 4 或 8 字节) - 您分配给它们的类型只是告诉编译器如何取消引用该值。char*s 占用与void*s 相同的空间,但不能取消引用void*s。编译器不会让你这样做。

另外,如果您只是处理简单的整数,那么您很可能会因所谓的“别名”而显着减慢程序速度,这基本上会迫使编译器始终读取给定地址的值。但内存访问速度很慢,因此您需要优化这些内存访问。