考虑以下2个声明。
*
出现在数据类型旁边,而不是在变量
char* ptr1, * ptr2, * ptr3; //all 3 are pointers
*
出现在变量旁边,而不是数据类型
char *ptr1,*ptr2,*ptr3; //again all 3 are pointers
2个声明之间的解释是否有任何不同。我知道变量没有区别。
引入void指针的理由是什么?
答案 0 :(得分:5)
唯一的区别是空格,它们最终成为指向字符的指针。我个人使用char * ptr1
,在我的代码中使用了大量的空格。
Void指针可以指向任何类型的对象并且没有大小。例如,这可行(但不是一个好主意):
int * ptr1;
float * ptr2;
(*ptr1) = 17;
ptr2 = (void*)ptr1;
(*ptr2)
现在将ptr1的字节解释为float而不是int,从而得到不同的结果。您可以在不同类型之间切换指针到函数typedef中的void*
也有一些用途。
此外,如果您有char * ptr1
并执行ptr1++
,则会增加地址ptr1引用sizeof(char)
。对于void *,这是不可能的,它会给你一个编译器错误,说它不知道要增加的大小。
答案 1 :(得分:1)
Void指针是指向某些未知数据的指针,它们可以转换为任何类型,因此不是类型安全的,它们可能会使程序崩溃,如果需要总变量,请使用boost :: any。
声明之间没有区别。
答案 2 :(得分:1)
*
不会“出现在数据类型旁边”或“变量旁边” - 您甚至可以写char*a,*b;
。重要的是优先权。 *
绑定到右侧,因此绑定到变量名称。这也意味着char* a, b;
等同于char (*a), b;
,并且将生成指向char a
和char b
的指针,而不是两个指针。如果您需要两个指针,则需要使用char *a, *b;
,如您的示例所示。memcpy()
复制任意数据。它并不关心它传递的数据。由于您不知道在实现该函数时将传递哪些数据,因此您需要使用void*
,否则您需要为每种数据类型(组合)提供memcpy()
函数。由于这是一个c库函数而c不支持函数重载,因此需要使用不同名称的memcpy()
函数。答案 3 :(得分:1)
void指针表示缺少数据类型,因此可用于指向任何类型的数据。但是,由于数据类型未知,因此无法直接对指针进行引用。为此,需要事先将指针强制转换为某种数据类型。
void指针适用的情况: 有时,使函数接受不同类型的数据,例如int,char,double等,可以使用模板。 (虽然重载功能是一种选择,但效率最低的方式)。另一种方法是使用void指针。
void FunctionName(void * data,type param) { / *基于第二个参数param,取消引用指针数据 可以以期望的方式处理数据。 * / }
提醒一下: 应区分Void指针和空指针,因为它们具有不同的用法和功能。后者确实有一个指针类型,但没有指向任何数据的任何有效地址。
答案 4 :(得分:0)
我听到一个笑话,说如果你问一个C ++程序员,他们会告诉你把它放在左边,一个C程序员在右边。
最终,由于*绑定到变量,而不是类型名称,因此将其置于右侧以使代码更清晰无疑是一个更好的主意。但是,因为在C ++中没有理由处理原始指针,所以我从未遇到过问题。