此代码:在void *指针中引用问题?
int p = 10;
void *q;
*q = 10;
不会编译:
'=':无法从 '诠释' 转换成 '无效*'
然而,这个代码编译罚款:
int p = 10;
void *q;
q = &p;
背后的原因是什么?
此代码:在void *指针中引用问题?
int p = 10;
void *q;
*q = 10;
不会编译:
'=':无法从 '诠释' 转换成 '无效*'
然而,这个代码编译罚款:
int p = 10;
void *q;
q = &p;
背后的原因是什么?
甲void *
指向未知类型的数据(如果它被初始化的第二代码块,其你的不是)。
您只能分配给已知类型的变量,或者通过已知类型的指针。
int p = 10;
void *q = &p;
*(int *)q = 20;
if (p != 20)
...something has gone horribly wrong...
此转换void *
成int *
,然后分配一个值到解除引用的整数指针。
第一个片段是未定义的行为。
您无法取消引用无效指针。即使你可以,你的代码将写入一些随机存储器地址,并可能崩溃。
在要分配的正常工作的指针的地址,因为你可以指定任何存储器地址到void*
两段代码(尝试)做不同的事情。
第一个尝试将值10分配给对象q
指向。这里有两个问题。首先你从来没有初始化指针。您需要先将其指向某处,然后才能更改其指向的值。其次,你不能取消void*
,因为这个类型是未知的。
第二段代码是将变量p
的地址分配给q
。此q
之后将指向存储在p
中的对象。
这在内存q
点更改地址:
q = &p;
这不能什么q
点式的人物出来(int
,long
,std::string
,int**
等);所有它知道是在内存中的位置:
*q = 10;
你可以这样做:
int *iq = static_cast<int*>(q);
*iq = 10;
你可能想了解更多关于void*
s。
void *不知道它拿着多少,它拿着什么?
所以你可以指定任何指针类型,因为它可以包含任何大小!但不能分配一个值,因为它不知道它必须存储什么......!
您的指针q
不指向任何内存位置。所以你不能给它分配值。
错误。什么错误? (在这种情况下,它有点显而易见,但你应该总是发布错误。) –
'=':不能从'int'转换为'void *' – teacher
你的编译器很奇怪......它想要从'* q = 10;'''int'''void *' ???在该语句中,'10'的类型为'int','* q'的类型为'void'。 – pmg