2010-05-01 83 views
0

考虑下面的2个声明。声明指针变量的不同类型

*旁边显示的数据类型和不相邻的可变

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

*旁边显示变量和不相邻的数据类型

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

是否有2点声明之间在旅游解说的任何差异。我知道变量没有区别。

介绍void指针的基本原理是什么?

回答

5

唯一的区别是空白,他们最终成为指向字符的指针。我个人使用char * ptr1,在我的代码中使用了大量的空白。

无效指针可以指向任何类型的对象并且没有大小。例如,这个工作(但不是一个真正的好主意):

int * ptr1; 
float * ptr2; 
(*ptr1) = 17; 
ptr2 = (void*)ptr1; 

(*ptr2)现在将解释PTR1的字节作为一个浮动,而不是一个int,给你一个不同的结果。您可以在类型之间切换。在指针函数typedef中也有一些用于void*的用法。

此外,如果您有char * ptr1和做ptr1++,您将递增地址ptr1指由sizeof(char)。这是不可能的void *,它会给你一个编译器错误,说它不知道增加的大小。

1

空指针指向某种未知的数据,他们可以转换为任何类型的,因此不是类型安全的,他们可能会崩溃您的程序,使用升压::如果任何有需要的总变异。
声明之间没有区别。

1
  1. 唯一的区别在于空白不相关。 *不会“出现在数据类型旁边”或“在变量旁边” - 您甚至可以编写char*a,*b;。重要的是优先权。 *绑定到右侧,所以到变量名称。这也意味着,char* a, b;相当于char (*a), b;,并会导致一个字符指针a和炭b,而不是两个指针。如果你想两个指针,你需要使用char *a, *b;,因为在你的榜样。
  2. void指针是指向内存的指针,没有指定类型。编写一个应该接受各种类型数据的函数时,这非常有用。例如,c库函数memcpy()可以复制任意数据。它不关心它传递的数据。正如您不知道什么数据会获得通过实施,您需要使用void*对于该功能时,否则您将需要一个memcpy()功能为每个数据类型(组合),你可以通过。由于这是一个c库函数,并且c不支持函数重载,因此需要使用不同名称的很多函数。
1

void指针表示没有数据类型,因此可以用来指向任何类型的数据。但是,由于数据类型是未知的,因此无法直接引用指针。为此,需要事先将指针转换为某种数据类型。

无效指针适用的情况: 有时,为了使函数接受不同类型的数据,例如, int,char,double等,可以使用模板。 (虽然重载函数是一个选项,但效率最低的方法)。为此目的的另一种方法是使用void指针。

空隙使用functionName(void *的数据,类型PARAM) { /*基于所述第二参数PARAM,解除引用这样的指针数据 的数据能够以期望的方式来处理。 * /}

就在提醒:因为他们确实有使用和功能的不同目的 空指针和空指针应加以区分。后者具有指针类型,但不指向任何有效的任何数据地址。

0

我听到一个笑话,说如果你问一个C++程序员,他们会告诉你把它放在左边,而右边是一个C程序员。

最终,由于*绑定到变量,而不是类型名称,所以将它放在让代码更清晰的权利上无疑是个好主意。但是,由于在C++中没有理由处理原始指针,所以我从来没有遇到过问题。

+1

“毫无疑问”?所以你说C++程序员做了一些“无疑”错误的事情? 有些人把它放在左边的原因是它更直观。它是类型规范的一部分。你正在创建一个int指针,而不是一个int。根据你的观点,任何一个选项都是最明显的选择。 – jalf 2010-05-01 19:56:04

+1

“毫无疑问”!=重要。我总是亲自把它放在左边,尽管最好不要这样说,这是最后声明的要点。 – Puppy 2010-05-02 12:29:08