考虑下面的2个声明。声明指针变量的不同类型
*
旁边显示的数据类型和不相邻的可变
char* ptr1, * ptr2, * ptr3; //all 3 are pointers
*
旁边显示变量和不相邻的数据类型
char *ptr1,*ptr2,*ptr3; //again all 3 are pointers
是否有2点声明之间在旅游解说的任何差异。我知道变量没有区别。
介绍void指针的基本原理是什么?
考虑下面的2个声明。声明指针变量的不同类型
*
旁边显示的数据类型和不相邻的可变
char* ptr1, * ptr2, * ptr3; //all 3 are pointers
*
旁边显示变量和不相邻的数据类型
char *ptr1,*ptr2,*ptr3; //again all 3 are pointers
是否有2点声明之间在旅游解说的任何差异。我知道变量没有区别。
介绍void指针的基本原理是什么?
唯一的区别是空白,他们最终成为指向字符的指针。我个人使用char * ptr1
,在我的代码中使用了大量的空白。
无效指针可以指向任何类型的对象并且没有大小。例如,这个工作(但不是一个真正的好主意):
int * ptr1;
float * ptr2;
(*ptr1) = 17;
ptr2 = (void*)ptr1;
(*ptr2)
现在将解释PTR1的字节作为一个浮动,而不是一个int,给你一个不同的结果。您可以在类型之间切换。在指针函数typedef中也有一些用于void*
的用法。
此外,如果您有char * ptr1
和做ptr1++
,您将递增地址ptr1指由sizeof(char)
。这是不可能的void *,它会给你一个编译器错误,说它不知道增加的大小。
空指针指向某种未知的数据,他们可以转换为任何类型的,因此不是类型安全的,他们可能会崩溃您的程序,使用升压::如果任何有需要的总变异。
声明之间没有区别。
*
不会“出现在数据类型旁边”或“在变量旁边” - 您甚至可以编写char*a,*b;
。重要的是优先权。 *
绑定到右侧,所以到变量名称。这也意味着,char* a, b;
相当于char (*a), b;
,并会导致一个字符指针a
和炭b
,而不是两个指针。如果你想两个指针,你需要使用char *a, *b;
,因为在你的榜样。memcpy()
可以复制任意数据。它不关心它传递的数据。正如您不知道什么数据会获得通过实施,您需要使用void*
对于该功能时,否则您将需要一个memcpy()
功能为每个数据类型(组合),你可以通过。由于这是一个c库函数,并且c不支持函数重载,因此需要使用不同名称的很多函数。void指针表示没有数据类型,因此可以用来指向任何类型的数据。但是,由于数据类型是未知的,因此无法直接引用指针。为此,需要事先将指针转换为某种数据类型。
无效指针适用的情况: 有时,为了使函数接受不同类型的数据,例如, int,char,double等,可以使用模板。 (虽然重载函数是一个选项,但效率最低的方法)。为此目的的另一种方法是使用void指针。
空隙使用functionName(void *的数据,类型PARAM) { /*基于所述第二参数PARAM,解除引用这样的指针数据 的数据能够以期望的方式来处理。 * /}
就在提醒:因为他们确实有使用和功能的不同目的 空指针和空指针应加以区分。后者具有指针类型,但不指向任何有效的任何数据地址。
我听到一个笑话,说如果你问一个C++程序员,他们会告诉你把它放在左边,而右边是一个C程序员。
最终,由于*绑定到变量,而不是类型名称,所以将它放在让代码更清晰的权利上无疑是个好主意。但是,由于在C++中没有理由处理原始指针,所以我从来没有遇到过问题。
“毫无疑问”?所以你说C++程序员做了一些“无疑”错误的事情? 有些人把它放在左边的原因是它更直观。它是类型规范的一部分。你正在创建一个int指针,而不是一个int。根据你的观点,任何一个选项都是最明显的选择。 – jalf 2010-05-01 19:56:04
“毫无疑问”!=重要。我总是亲自把它放在左边,尽管最好不要这样说,这是最后声明的要点。 – Puppy 2010-05-02 12:29:08