假设我有一个像这样声明的数组:
int *p = new int[size];
p
当然会指向第一个元素的地址。但由于一个字节是内存的最小可寻址单位,p
实际上是否指向数组第一个元素的前4个字节的第一个字节?
答案 0 :(得分:7)
int
的地址不一定与其对象表示中第一个字节(char
)的地址完全相同。这是因为某些机器具有缺少位的本机指针寄存器,因此sizeof (char *) != sizeof (int *)
是可能的。
尽管如此,将int *
可转换折扣为通过static_cast< char * >( p )
指向对象表示的第一个字节的指针。您可以将结果指针传递给std::memcpy
以初始化另一个int
或其第一个成员为int
的任何POD类类型。 (因此,“第一个字节”被定义为具有最低地址的那个。)
对于您在通用计算中可能遇到的任何计算机,char *
和int *
在物理上是相同的;它们之间的差异只是由编译器强制执行以实现代码安全性。但是确实存在奇异的体系结构static_cast
在这种情况下做了一些有意义的事情,像reinterpret_cast
这样的事情会完全失败,执行正确的转换。
答案 1 :(得分:0)
是的,它确实指向了四个字节中的第一个。在大Endian的情况下,四个字节看起来像0 0 0 1.在小Endian的情况下,字节看起来像1 0 0 0.所以,为了确保,在大Endian的情况下,第一个字节将包含0,而在小Endian的情况下,第一个字节将包含1。
答案 2 :(得分:0)
简而言之,没有。因为p被初始化为int *,所以p的每个元素都将取int的字节数。澄清:
int* p = new int[4];
for(int i = 0; i < 4; i++)
p[i] = i;
cout << p[0] << " " << p[1] << " " << p[2] << " " << p[3];
这将输出“0 1 2 3”。您不必担心单个字节。一般来说,情况也是如此:
*p = p[0];