Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 允许铸造(双*)到(双**)?_C++_Pointers_Casting_Undefined Behavior_Strict Aliasing - Fatal编程技术网

C++ 允许铸造(双*)到(双**)?

C++ 允许铸造(双*)到(双**)?,c++,pointers,casting,undefined-behavior,strict-aliasing,C++,Pointers,Casting,Undefined Behavior,Strict Aliasing,因为我参加了一次讨论,讨论中被告知“通过不兼容的指针类型使用别名是未定义的行为”(例如,double d;int*p=(int*)&d;以下问题: 是否允许将(double*)强制转换为(double**),例如double*d1;double**d2=&d2和d2[0][y]等语法,希望与d1[y]相同 我知道这并不是通过不兼容的指针类型进行别名,但我不确定。背景是,我希望有一个在二维数组(=图像)上运行的函数,但我希望能够只传递图像的一行或一列 是否允许将(double)强制转换为(doub

因为我参加了一次讨论,讨论中被告知“通过不兼容的指针类型使用别名是未定义的行为”(例如,
double d;int*p=(int*)&d;
以下问题:

是否允许将
(double*)
强制转换为
(double**)
,例如
double*d1;double**d2=&d2
d2[0][y]
等语法,希望与
d1[y]
相同

我知道这并不是通过不兼容的指针类型进行别名,但我不确定。背景是,我希望有一个在二维数组(=图像)上运行的函数,但我希望能够只传递图像的一行或一列

是否允许将(double)强制转换为(double*),例如double*d1;double**d2=&d2,并使用类似于d2[0][y]的语法,希望与d1[y]相同

当然不是,而且是这样

但如果你的意思是:

double *d1; 
double **d2 = &d2;
那么是的,上面的内容是完全有效的,因为
d2[0][y]
可以被视为
(*d2)[y]
,所以根本没有问题

最后,请记住,在上面的代码中,你没有任何东西:<代码>和D2<代码>已经是“代码>双*<代码>。如果你必须要做一些事情,请使用C++风格的转换(<代码> StasyType Case<代码>,<代码>动态> CAST ,<代码> RealTytCase等),而不是C风格的铸件。 是否允许将(double)强制转换为(double*),例如double*d1;double**d2=&d2,并使用类似于d2[0][y]的语法,希望与d1[y]相同

当然不是,而且是这样

但如果你的意思是:

double *d1; 
double **d2 = &d2;
那么是的,上面的内容是完全有效的,因为
d2[0][y]
可以被视为
(*d2)[y]
,所以根本没有问题


最后,请记住,在上面的代码中,你没有任何东西:<代码>和D2<代码>已经是“代码>双*<代码>。如果你必须要做一些事情,请使用C++风格的转换(<代码> StasyType Case<代码>,<代码>动态> CAST ,<代码> RealTytRase等。而不是C样式强制转换。

double**
double*
不兼容。转换是合法的,但对结果唯一可以做的就是将其强制转换回。这似乎或多或少是显而易见的:在32位机器上,
double*
甚至与
double
的大小都不一样


但您的示例不会将
double*
转换为
double*
。它会创建一个新的
double**
,指向
double*
。这很好。

double**
double*
不兼容。转换是合法的,但您唯一可以对结果执行的操作是将其回滚。这是似乎或多或少是显而易见的:在32位机器上,
double*
的大小甚至与
double
的大小不同


但是您的示例没有将
double*
转换为
double**
。它创建了一个新的
double**
,指向
double*
。这很好。

您不进行强制转换。事实上,double**d2=&d1是有效的。在第一段中,您是指
double d;int*p=(int*)&d、 
。?@user1158692:是的,我更正了。你不做铸造。事实上,double**d2=&d1是有效的。在第一段中,你的意思是
double d;int*p=(int*)&d;
。?@user1158692:是的,我更正了。