C++ C+中的指针+;,原始内存操作

C++ C+中的指针+;,原始内存操作,c++,pointers,C++,Pointers,关于下面的代码片段,我有几个不同的问题,我的一位教授给出了一个例子 首先,什么是t{8,15}?这是一个由8和15两个整数组成的数组吗? 或者这是将t(Thing类型的变量)的x和y值分别初始化为8和15? 第二,线上发生的事情: std::cout << "n\t = " << place[0] << ", " << place[1]; 我迷路了。请容忍我,学习指南和记忆 我正在处理的代码: struct Thing { int x , y ;

关于下面的代码片段,我有几个不同的问题,我的一位教授给出了一个例子

首先,什么是t{8,15}?这是一个由8和15两个整数组成的数组吗? 或者这是将t(Thing类型的变量)的x和y值分别初始化为8和15? 第二,线上发生的事情:

std::cout << "n\t = " << place[0] << ", " << place[1];
我迷路了。请容忍我,学习指南和记忆

我正在处理的代码:

struct Thing {
int x , y ;
int* getPlaces () {
    return & x ;
}
};

int main () {

Thing t {8 ,15};
int* place = (int *)& t ;
std :: cout << "\nt = " << place [0] << ", " << place [1];
int y = *( int *)(( char *)& t + 4);
std :: cout << "\nt.y = " << y ;
int* location = t . getPlaces ();
location [0] = 17;
std :: cout << "\nt.x = " << t . x ;

}
struct东西{
int x,y;
int*getPlaces(){
return&x;
}
};
int main(){
事物t{8,15};
int*place=(int*)&t;
标准::cout
它正在初始化t。x和y是初始化为8和15的t的成员

位置[0]和位置[1]将打印8和15,因为位置在前一行中指向t

int y = *( int *)(( char *)& t + 4);

t被转换为(char*),然后加上4,然后在转换为int*后取消引用。它将打印15。

{8,15}
是一个初始值设定项列表。因此,
东西t{8,15}
是用值8和15初始化的
Thing
类型的变量
t
的声明。成员按声明顺序用这些值初始化,即x=8和y=15

int*place
是指向int的指针的声明,但在C/C++中,指针始终也是一个数组。因此,您可以为
place
指向的变量编写
place[0]
,为紧跟其后的变量编写
place[1]
等等。没有边界检查,因此一定要知道您要做什么

(某些类型)
是一个(C样式)强制转换。强制转换强制以下表达式以某种方式进行解释。在您的示例中,
&t
取t的地址。然后该指针被强制解释为指向
字符的指针(本质上意味着每个项都是一个字节)。也就是说,当你在指针上加4时,你指向4个字节过去。接下来(在左边),整个东西被解释为指向
int
的指针。最后(在最左边的
*
),整个东西被取消引用,产生在该地址上发现的任何东西,被称为
int


小结:此示例仅用于学习。在实际程序中,切勿使用此类程序。代码取决于
int
为4字节,并且取决于CPU允许在任何地址上使用
int
的能力。情况并非总是如此。

*(int*)((char*)&t+4)
非常糟糕,它以一种不好的方式打破了严格的别名。
place
的使用也是如此。如果你的教授给了你那段代码,你应该告诉他或她。我认为这个练习的目的是自己运行代码,看看结果,然后用它来获得理解。@SomeProgrammerDude这很难看,但不是一个严格的错误iasing违例,因为在该内存位置已经有一个int对象。@Frank这是违例,因为代码将
t
视为两个
int
值的数组,而不是。不管
&t
是否指向
int
&t
是指向
对象的指针,而不是指向的指针ode>int
,这就是问题的症结所在。将g转换为char*
可能会解决问题,但我不是很确定。@SomeProgrammerDude是的,我同意,place确实违反了规则,我只是对你评论的第一部分进行了评论,很抱歉造成混淆。将g转换为char*可以解决问题,因为它转换为值得注意的是,添加虚拟方法(或将当前getPlaces声明为虚拟)会破坏一切。“[P]ointer始终也是一个数组”这是非常错误的。指针是指针,数组是数组,它们是不同的。数组可以衰减为指向其第一个元素的指针,这就是初学者犯此错误的原因。@Someprogrammerdude同意。我应该更精确一些。
Thing t {8 ,15};
int y = *( int *)(( char *)& t + 4);