这是程序
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 + 1
和p + 2
时,它会分别提供不同的输出:0x24fe08
,0x24fe0c
。请帮我理解这个算术。为什么p+1
,p+2
不等于地址,因为它贡献了相同的4个字节。
答案 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
的原因