[英]What's the difference between type name() and type name = type()?
[英]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** name
和Type* 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** name
, name
是一个指向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.