您询问如何为指针分配常量地址,但这样做 (a) 非常不可移植,并且 (b) 不一定符合您的目的,即查看递增指针的效果。
这是一个程序,可以满足您的好奇心,而不会因未定义的行为而崩溃:
#include <iostream>
int main() {
const int len = 10;
char char_array[len];
int int_array[len];
char *cp = char_array;
for (int i = 0; i <= len; i ++) {
std::cout << "cp = " << static_cast<void*>(cp) << "\n";
cp ++;
}
std::cout << '\n';
int *ip = int_array;
for (int i = 0; i <= len; i ++) {
std::cout << "ip = " << static_cast<void*>(ip) << "\n";
ip ++;
}
}
我的(64 位)系统上的输出是:
cp = 0x7fffaa5ddc30
cp = 0x7fffaa5ddc31
cp = 0x7fffaa5ddc32
cp = 0x7fffaa5ddc33
cp = 0x7fffaa5ddc34
cp = 0x7fffaa5ddc35
cp = 0x7fffaa5ddc36
cp = 0x7fffaa5ddc37
cp = 0x7fffaa5ddc38
cp = 0x7fffaa5ddc39
cp = 0x7fffaa5ddc3a
ip = 0x7fffaa5ddc00
ip = 0x7fffaa5ddc04
ip = 0x7fffaa5ddc08
ip = 0x7fffaa5ddc0c
ip = 0x7fffaa5ddc10
ip = 0x7fffaa5ddc14
ip = 0x7fffaa5ddc18
ip = 0x7fffaa5ddc1c
ip = 0x7fffaa5ddc20
ip = 0x7fffaa5ddc24
ip = 0x7fffaa5ddc28
对此的一些说明:
指针增量是有效的,因为每个指针始终指向正确类型的数组的一个元素,或者只是超过它的末尾。(你可以在数组末尾构造一个指针;你不能取消引用这样的指针。)
打印类型指针时产生的输出void*
是实现定义的。在我的系统上,它恰好是指针值的十六进制表示,被解释为好像它是一个整数——这可能是它最常见的完成方式。
您可以看到char*
指针似乎每次都增加 1,并且int*
指针每次增加 4。在我的系统(可能还有您的系统)上,指针存储为字节地址。指针算术以指向类型为单位定义,而不是以字节为单位。递增int*
指针会导致它指向上一个位置sizeof (int)
之后的内存位置字节 - 在本例中为 4 个字节。所有的指针算法都是这样定义的;ptr2 - ptr1
为您提供两个地址之间的元素数量(无论类型ptr1
和ptr2
指向)。
打印的特定值告诉您有关如何在系统上管理内存地址的信息。指针和整数之间的映射一般会反映系统的内存模型。该模型在很大程度上是特定于实现的。