Type ** name和Type * name []有什么区别?
为什么有人会使用一个而不是另一个?
由于
答案 0 :(得分:13)
那取决于它是在变量声明中还是在函数参数中?如果在变量声明中:
Type** name = &pointer_to_type;
Type* name[] = { &pointer_to_type, 0, &pointer_to_type };
第一个是指向类型指针的指针,而第二个是指向长度为3的类型的指针数组。
如果在函数参数中,它们是相同的。数组衰减为指针,Type** name
和Type* 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 []。所以它们“几乎”相同。