C++引用添加变量



c++编译器如何翻译此代码片段?

int i = 5;
int j = 4;
int *p = &j + i;

它创建一个指针'p',等于,

  1. j的地址+i的地址
  2. j+i的地址

还是其他什么?

由于&运算符的优先级高于+运算符,因此在j的地址中添加i的值,因此,如果尝试取消引用此指针(p指向无效内存地址(,则会出现未定义行为。正如评论中所指出的,无效的地址分配本身没有害处,但当这样的指针被取消引用时,情况将变得灾难性。

作为示范:

#include <iostream>
int main () {
int i = 3;
int j = 333;
int *p = &j + i;
std::cout << "Address before: " << &j << 'n';
std::cout << "Address after: " << p << 'n';
std::cout << "sizeof(int): " << sizeof(int) << std::endl;
}

打印:

Address before: 0x7fff809f9998
Address after: 0x7fff809f99a4 // Address before + three sizeof(int)
sizeof(int): 4
int i = 5;
int j = 4;
int *p = &j + i;

这里pint类型的指针变量。因此,它将存储int变量的地址。因此,在int *p = &j +i;的第3行,您正在存储j+变量i的地址。因此,设j的地址为100,i为5,因此它将把100+5=105地址存储在p中。并且该地址105目前不包含任何值。所以输出取决于编译器。它可以给出垃圾值或错误或0作为输出。

int main()
{
int i = 5;
int j = 4;
*(&j + i)=10;
int *p = &j + i;

cout<<*p;
return 0;
}

所以你们可以试试上面的程序,在第3行,我们将10存储在地址105。

此处,

指针'p'是这样分配或计算的:">(j的地址(+j*sizeof(int或指针的数据类型("。但在c++(或任何语言(中,这不是一个有效的语句,因为我们不能将任何随机地址分配给指针,因为地址分配(意味着

内存分配查看上面的计算:-您可以通过如下类型将十六进制值转换为int值来查看:-

#include <bits/stdc++.h>
using namespace std;
int main()
{
int i = 7;
int j = 5;
cout << i << endl;
cout << &i << endl;
cout << int(&i) << endl;
cout << j << endl;
cout << &j << endl;
cout << int(&j) << endl;
int *p = &j + i;
cout << p << endl;
cout << int(p) << endl; // here int(p) = int(&j)+i*(sizeof(int))
return 0;
}

最新更新