假设我有一个这样声明的数组:
int *p = new int[size];
当然p
会指向第一个元素的地址。但是由于字节是内存的最小可寻址单元,p
实际上是否指向数组第一个元素的前 4 个字节的第一个字节?
an 的地址不一定与其对象表示int
中的第一个字节 ( ) 的地址完全相同。char
这是因为某些机器具有缺少位的本机指针寄存器,这sizeof (char *) != sizeof (int *)
是可能的。
不过,打折的是,int *
可以通过转换为指向对象表示的第一个字节的指针static_cast< char * >( p )
。您可以将结果指针传递给以std::memcpy
初始化另一个int
或任何第一个成员为int
. (因此,“第一个字节”被定义为具有最低地址的字节。)
对于您在通用计算中可能遇到的任何机器,char *
并且int *
在物理上是相同的;出于代码安全的目的,它们的差异只是由编译器强制执行的。但是确实存在异国情调的架构,static_cast
在这种情况下会做一些有意义的事情,并且reinterpret_cast
会完全无法执行正确的转换。
是的,它确实指向四个字节中的第一个。在大端的情况下,四个字节看起来像 0 0 0 1。在小端的情况下,字节看起来像 1 0 0 0。所以,为了确定,在大端的情况下,第一个字节将包含一个 0,而在 little Endian 的情况下,第一个字节将包含一个 1。
简而言之,没有。因为 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];