繁体   English   中英

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

[英]What is the difference between Type** name, and Type* name[]?

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

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

谢谢

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

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

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

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

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

符号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)将取决于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 */

取决于上下文。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM