我正在尝试理解这行代码。有人能帮我吗?它是将结果保存在变量val还是变量val的地址中?
*((int*)(&val) +1)= A*(y) + (B - C)
谢谢
答案 0 :(得分:9)
val
取(int*)(&val)
的地址
int
将此地址视为指向(int*)(&val) +1
的指针
sizeof(int)
将此地址增加1(次*((int*)(&val) +1) = ...
)
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int correctAnswers = 0;
/*This a is called a Do-While loop and will execute the code inside once
*before checking the boolean statement
*/
do{
System.out.println("What is your name?"); //Line A
String name = scan.nextLine();
System.out.println("Entered name: " + name + "\n");
//Removed printing empty line and replaced with new line character
switch (name){
case "Sam":
System.out.println("aaa");
correctAnswers++;
break; // From here it repeats back to line A
case "Michael":
System.out.println("bbb!");
correctAnswers++;
break; // From here it repeats back to line A
case "Arnold":
System.out.println("ccc!");
correctAnswers++;
break; // From here it repeats back to line A
default:
System.out.println("Try again!");
}
} while (correctAnswers < 3);
System.out.println("Thank you");
}
}
在此递增的地址
答案 1 :(得分:3)
它将val
解释为整数数组,并将右手表达式的结果存储在其第二个元素中。要准确理解它的全部内容,你应该提供更多的上下文(我的猜测:它是否操纵double
值的原始内容?)
请注意,根据val
的类型,由于严格的别名规则,这可能是未定义的行为。
答案 2 :(得分:2)
将表达式*((int*)(&val) +1)
划分为较小的表达式以理解它:
val
的地址(&val)
并将其视为指向int (int *)
的指针+1
添加到此指针,这意味着将指针移动到下一个int&#39;因为它是一系列的整数。*
和=
合并,将右侧表达式应用于指针指向的int
。答案 3 :(得分:1)
我希望其他人回答你的问题。添加其他人所说的,相同的代码可以写成如下:
(int*)(&val)[1]= A*(y) + (B - C)
其中(int *)将类型转换为&amp; val作为指向val的地址的整数的隐式指针,[1]指示存储val的位置前面的第一个整数位置。
这是解释数组的方式。假设你有一个数组
int a[10];
对于这个数组,'a'是指向基地址(元素a [0]的地址)的指针, a [i] 是除了 *(a + i)之外什么都没有,即i元素位于数组第一个元素之前的位置。
答案 4 :(得分:0)
想象一下这个课程:
class A {
int number = 10;
public:
void print(){ std::cout << number; }
};
int number
是私有的访问不使用!
那么我们如何才能访问此私有int
。
简单地说:
A obj;
*( (int*) ( &obj ) ) = 100;
obj.print();
<强>输出强>
100
现在,如果您有多个数据,那么如何访问?
通过这种语法:
*((int*)(&val) +1)
它说:
找到第一个数据的地址,
一个指标继续,
把它投到int*
,
然后取消引用它,
然后初始化它