指针是否与字节地址相同?

时间:2013-06-30 23:01:25

标签: c++ pointers byte

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

int *p = new int[size];

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

3 个答案:

答案 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];