C ++中的指针,sizeof()和地址

时间:2016-08-20 15:15:14

标签: c++ pointers sizeof pointer-arithmetic

这是程序

int main() {   
    cout << sizeof(int) << endl;        // for int its 4 in g++ compiler

    int *p;
    int a = 5;
    p = &a;
    cout << "The value of p is: " << p << endl;
    cout << "The value of p + integer is: " << p + 0 << endl;

    // lets take the size of individual 1, 2, 3
    cout << "The sizeof(0) is: " << sizeof(0) << endl;   // 4
    cout << "The sizeof(1) is: " << sizeof(1) << endl;   // 4
    cout << "The sizeof(2) is: " << sizeof(2) << endl;   // 4

    cout << "The value of p + 0 is: " << p + 0 << endl;
    cout << "The value of p + 1 is: " << p + 1 << endl;
    cout << "The value of p + 2 is: " << p + 2 << endl;

    return 0;
}

C ++中的sizeof()函数在sizeof(int)编译器中提供g++ 4个字节。所以我将sizeof(1)sizeof(2)sizeof(0)打印到终端,我得到了4个字节。

所以我在上面链接的程序中尝试了一些指针算法。我在指针变量中添加了1。让我们说int *p; int a = 10;。现在我分配了p = &a;。现在,当我打印p时,它会0x24fe04,而当我打印p + 0时,它会相同。但是,当我尝试添加p + 1p + 2时,它会分别提供不同的输出:0x24fe080x24fe0c。请帮我理解这个算术。为什么p+1p+2不等于地址,因为它贡献了相同的4个字节。

2 个答案:

答案 0 :(得分:0)

指针就是这样,它指向另一个内存区域。

int a = 3; 
int *p = &a;
++a;
std::cout << p << std::endl;    
std::cout << *p << std::endl;
std::cout << &p << std::endl;
std::cout << &a << std::endl;

应输出:

The address of a
4
The address of p
The address of a

如果执行p + 1,则从一个地址向上移动4个字节的内存堆栈,因为在32位机器上,内存被索引到该对齐。在64位计算机上,它具有两倍的对齐,因此由于内存索引差异,您无法混合32位和64位代码。

您还有指针指针,因此您可以操作指针

int **pp = &p
std::cout << *pp; // = 4 = p = a

修改

应该检查一下,我的错误,我已经修复了以上感谢Benjamin Lindley

答案 1 :(得分:0)

当您说p + 1时,意为p + 1 * sizeof(int)。正如我之前提到的here,公式是

                                 =  +  × 

这就是为什么在尝试0x24fe04时获得p + 0,为0x24fe08获取p + 1的原因