Type ** name和Type * name []有什么区别?

时间:2011-10-04 22:45:04

标签: c++ c

Type ** name和Type * name []有什么区别?

为什么有人会使用一个而不是另一个?

由于

4 个答案:

答案 0 :(得分:13)

那取决于它是在变量声明中还是在函数参数中?如果在变量声明中:

Type** name = &pointer_to_type;
Type* name[] = { &pointer_to_type, 0, &pointer_to_type };

第一个是指向类型指针的指针,而第二个是指向长度为3的类型的指针数组。

如果在函数参数中,它们是相同的。数组衰减为指针,Type** nameType* name[]都与函数参数完全相同。但是,第二种形式清楚地表明name是一个未知长度的指针数组,而第一个不是。我会使用Type**来指定单个元素,使用Type*[]来指定数组。

答案 1 :(得分:4)

两者之间的差异主要在声明/定义任何一种类型的对象时得到证实。

符号Type *name[]创建一个未知大小的数组(可以从初始化程序推断),Type** name创建一个指针。这意味着:

char *array[]={"hello", "world", 0}; /* OK, array of size 3 */
char **ptr={"hello", "world", 0};    /* not possible */

他们在某些表达方式中表现不同。特别是,无法分配数组,但指针变量可以:

ptr++, ptr=array; /* assignment and mutation of ptr possible */
// array=whatever /* impossible */

sizeof运算符在两者上的工作方式不同。 sizeof(array)将取决于数组的元素数量(在这种情况下可能为12),但sizeof(ptr)总是返回相同的大小(例如,在主32位体系结构上为4)

另外,在声明全局变量时,不能混用两者:

extern char* data[];

必须在.c文件中附带

char* data[N];

反之亦然。基本上,定义数组意味着分配几个连续的对象,而定义指针意味着分配单个变量。编译器对待它们的方式不同,并且必须知道哪个是哪个。

但是,在向函数声明或传递参数时,它们是相同的。所以

int main(int argc, char** argv)
int main(int argc, char* argv[]) /* the same */

答案 2 :(得分:1)

取决于具体情况。

如果它定义了一个不是函数参数的变量,那么 在Type** name中,name是指向Type类型变量的指针,在Type* name[SOME_POSITIVE_INTEGER_CONSTANT]中,它是指向Type类型变量的指针数组

如果它是函数参数,则两者都相同,name是指向Type类型变量的指针。

答案 3 :(得分:0)

基本上,Type **是指向指针的指针。想象它(类型*)*。所以它指向Type *,它可以是Type或Type []。

另一个,Type *是一个指向Type的指针,在这种情况下,是一个数组Type []。所以它们“几乎”相同。