C++ 类型**名称和类型*名称[]之间有什么区别?

C++ 类型**名称和类型*名称[]之间有什么区别?,c++,c,C++,C,类型**名称和类型*名称[]之间有什么区别 为什么有人会用一个而不是另一个 谢谢,这取决于它是在变量声明中还是在函数参数中?如果在变量声明中: Type** name = &pointer_to_type; Type* name[] = { &pointer_to_type, 0, &pointer_to_type }; 第一个是指向类型的指针,而第二个是指向长度为3的类型的指针数组 如果在函数参数中,它们是相同的东西。数组衰减为指针,并且Type**name和Type

类型**名称和类型*名称[]之间有什么区别

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


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

Type** name = &pointer_to_type;
Type* name[] = { &pointer_to_type, 0, &pointer_to_type };
第一个是指向类型的指针,而第二个是指向长度为3的类型的指针数组


如果在函数参数中,它们是相同的东西。数组衰减为指针,并且
Type**name
Type*name[]
与函数参数完全相同。然而,第二种形式表明名称是长度未知的指针数组,而第一种形式则不是。我将使用
Type**
指定单个元素,并使用
Type*[]
指定数组。

基本上,Type**是指向指针的指针。像(Type*)*那样思考。所以它指向Type*,它可以是Type或Type[]


另一个,Type*是指向类型的指针,在本例中是数组类型[]。所以它们“几乎”是一样的。

取决于上下文

如果定义的变量不是函数参数,则 在
Type**name
中,
name
是指向
Type
类型变量的指针,而在
Type*name[某些正整数常量]
中,它是指向
类型变量的指针数组


如果它是一个函数参数,那么两者都是相同的,
name
是指向类型为
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)
将取决于数组的元素数量(在这种情况下可能是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 */

我怕你,小马。会员资格为32天,声誉为6000。这项技术是什么?我还想添加一些关于内存分配的内容:使用
Type*name[]
作为变量声明,在第一次解引用时自动获得有效内存(指针数组在堆栈上)。您可以按顺序使用这些命令:
Type*name[4];名称[3]=NULL
但是如果你用
类型**名称
来尝试,除非你手动将它指向一个有效的
类型*
@sidyll:?我甚至为此有一个徽章:PWell,我有一个狂热的徽章:-)无论如何,祝贺你在精确回答问题方面的努力和天赋。@sidyll,谢谢你的笑声。。。我也忍不住注意到那匹小马着火了@K、 这是给你的另一个徽章!事实上,两者没有区别。例如,在C程序中,我们总是看到char**argv和char*argv[]交替使用来向main声明参数。出于清晰或一致性的原因,您可以选择其中一个,而不是另一个。“数组不是左值”它们是左值。“所以它们不能被分配到”并且它无论如何也不会出现:(x不是左值)并不意味着(“x=whater;”格式不正确)。C++不是简单的语言。在非定义的变量声明中,您可以省略
某些正整数常量
@curiousguy:at file scope“int*ga[]”,结果是“警告:数组
ga'假定有一个元素”。在函数范围“int*ma[];”中,导致“错误:数组大小在
ma'中丢失”。你想避免这种情况。不过,“extern int*ega[];”也可以。这是使用gcc(3.3.4)编写的,编译为C并启用了所有警告。没有“文件范围”这样的东西。你可能指的是全球范围。在任何范围内,不带存储类限定符的变量声明也是一种定义。请不要将其视为
(Type*)*
!语法不是那样的。可以将其视为
类型*(*)
,或者更确切地说是
类型(*(*name))
:表达式
(*(*name))
属于类型
类型。(但它不适用于引用或函数。)