用于声明指针变量的不同类型

时间:2010-05-01 17:54:57

标签: c++ pointers

考虑以下2个声明。

*出现在数据类型旁边,而不是在变量

旁边
char* ptr1, * ptr2, * ptr3; //all 3 are pointers

*出现在变量旁边,而不是数据类型

旁边
char *ptr1,*ptr2,*ptr3; //again all 3 are pointers

2个声明之间的解释是否有任何不同。我知道变量没有区别。

引入void指针的理由是什么?

5 个答案:

答案 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)

  1. 唯一的区别在于无关紧要的空白。 *不会“出现在数据类型旁边”或“变量旁边” - 您甚至可以写char*a,*b;。重要的是优先权。 *绑定到右侧,因此绑定到变量名称。这也意味着char* a, b;等同于char (*a), b;,并且将生成指向char a和char b的指针,而不是两个指针。如果您需要两个指针,则需要使用char *a, *b;,如您的示例所示。
  2. void指针是指向内存的指针,但未指定类型。在编写应接受各种类型数据的函数时,这很有用。例如,c库函数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 ++中没有理由处理原始指针,所以我从未遇到过问题。