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:是的,我更正了。