Pointers C指针:void与其他类型

Pointers C指针:void与其他类型,pointers,Pointers,为什么gcc中允许以下内容: void **p1, **p2; p1=*p2; 但这会产生“不兼容指针类型的赋值”错误吗 因为*p2属于void*类型,这是通用(数据)指针类型。这意味着,您可以将任何数据指针类型分配给类型为void*的指针,也可以将void*分配给任何类型的数据指针。所以 (some void **) = (some void *); 这是有效的 但是,char**和char*是指向不同类型的指针,它们都不是void*,因此不能将它们分配给另一个。因为*p2属于void*

为什么gcc中允许以下内容:

void **p1, **p2;

p1=*p2;
但这会产生“不兼容指针类型的赋值”错误吗


因为
*p2
属于
void*
类型,这是通用(数据)指针类型。这意味着,您可以将任何数据指针类型分配给类型为
void*
的指针,也可以将
void*
分配给任何类型的数据指针。所以

(some void **) = (some void *);
这是有效的


但是,
char**
char*
是指向不同类型的指针,它们都不是
void*
,因此不能将它们分配给另一个。

因为
*p2
属于
void*
类型,这是通用(数据)指针类型。这意味着,您可以将任何数据指针类型分配给类型为
void*
的指针,也可以将
void*
分配给任何类型的数据指针。所以

(some void **) = (some void *);
这是有效的

但是,
char**
char*
是指向不同类型的指针,它们都不是
void*
,因此您无法将它们分配给其他类型。

您需要:

char **p1, **p2;
/* Make sure p2 has a valid value (i.e. points to a valid memory location) before the following statement */
p1=p2;
它在
void**
被指定为
void*
之间工作的原因是,void指针可以指向任何东西。

您需要:

char **p1, **p2;
/* Make sure p2 has a valid value (i.e. points to a valid memory location) before the following statement */
p1=p2;


它在
void**
被指定为
void*
之间工作的原因是,void指针可以指向任何东西。

char**p1,p2;p1=*p2不会编译。
字符**p1,p2;p1=*p2无法编译。我不明白的是为什么代码的顶部是合法的。在这两种情况下,指针的大小均为4字节,并指向4字节块(在32位操作系统上)的第一个单元。即使算法也不同:((void**)p)+1应以4的增量完成,而((void*)p)+1应以1的增量完成。“我弄错了吗?”伊万1。停止对sizef(T*)
进行假设(无论如何,这与警告无关)。2.您可以这样做,因为
void*
与任何数据指针类型都兼容,但
char*
不兼容。我不明白的是为什么代码的顶部是合法的。在这两种情况下,指针的大小均为4字节,并指向4字节块(在32位操作系统上)的第一个单元。即使算法也不同:((void**)p)+1应以4的增量完成,而((void*)p)+1应以1的增量完成。“我弄错了吗?”伊万1。停止对sizef(T*)
进行假设(无论如何,这与警告无关)。2.您可以这样做,因为
void*
与任何数据指针类型都兼容,但
char*
不兼容。由于p2的值正在转换为指针,上述操作也不应该起作用。这应该会产生分段错误。为什么不试着运行它,看看是否有分段错误?仅这两条线路不会导致任何seg故障,在不给p1或p2赋值的情况下解除p1或p2的参考将导致seg故障。我刚刚发布了代码片段,以说明他应该如何将值从p2分配到p1。p2中是否有有效值-在取消引用它之前应注意这一点。即使p2有有效值,也应导致分段错误,例如,如果说p2='a'和p1=p2。p1将包含97,即a的ascii值,这是不可接受的,并且将崩溃。@Koushik-有效值指的是有效的内存位置。显然,将垃圾值分配给指针并试图取消引用它们是愚蠢和毫无意义的,而不是显示您不应该执行的操作。是的,有效的内存位置满足p2*p2=&p1是一种可以接受的方式,正如您所提到的,由于p2的值正在转换为指针,因此上述方法也不应该起作用。这应该会产生分段错误。为什么不试着运行它,看看是否有分段错误?仅这两条线路不会导致任何seg故障,在不给p1或p2赋值的情况下解除p1或p2的参考将导致seg故障。我刚刚发布了代码片段,以说明他应该如何将值从p2分配到p1。p2中是否有有效值-在取消引用它之前应注意这一点。即使p2有有效值,也应导致分段错误,例如,如果说p2='a'和p1=p2。p1将包含97,即a的ascii值,这是不可接受的,并且将崩溃。@Koushik-有效值指的是有效的内存位置。显然,将垃圾值分配给指针并试图取消引用它们是愚蠢和毫无意义的,而不是显示您不应该执行的操作。是的,有效的内存位置满足p2*p2=&p1是您提到的一种可接受的方式