3

假设我有一个这样声明的数组:

int *p = new int[size];

当然p会指向第一个元素的地址。但是由于字节是内存的最小可寻址单元,p实际上是否指向数组第一个元素的前 4 个字节的第一个字节

4

3 回答 3

7

an 的地址不一定与其对象表示int中的第一个字节 ( ) 的地址完全相同。char这是因为某些机器具有缺少位的本机指针寄存器,这sizeof (char *) != sizeof (int *)是可能的。

不过,打折的是,int *可以通过转换为指向对象表示的第一个字节的指针static_cast< char * >( p )。您可以将结果指针传递给以std::memcpy初始化另一个int或任何第一个成员为int. (因此,“第一个字节”被定义为具有最低地址的字节。)

对于您在通用计算中可能遇到的任何机器,char *并且int *在物理上是相同的;出于代码安全的目的,它们的差异只是由编译器强制执行的。但是确实存在异国情调的架构,static_cast在这种情况下会做一些有意义的事情,并且reinterpret_cast会完全无法执行正确的转换。

于 2013-06-30T23:08:07.947 回答
0

是的,它确实指向四个字节中的第一个。在大端的情况下,四个字节看起来像 0 0 0 1。在小端的情况下,字节看起来像 1 0 0 0。所以,为了确定,在大端的情况下,第一个字节将包含一个 0,而在 little Endian 的情况下,第一个字节将包含一个 1。

于 2013-06-30T23:05:33.063 回答
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];
于 2013-06-30T23:08:02.807 回答