Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建指针数组时运算符new[]的语法_C++_New Operator_Dynamic Arrays_Dynamic Allocation - Fatal编程技术网

C++ 创建指针数组时运算符new[]的语法

C++ 创建指针数组时运算符new[]的语法,c++,new-operator,dynamic-arrays,dynamic-allocation,C++,New Operator,Dynamic Arrays,Dynamic Allocation,在创建指向char的指针数组时,使用new[]运算符时出现问题。由于char*是我希望元素的类型,因此我使用括号将其括起来,但它不起作用: char **p = new (char *)[vector.size()]; 但当我去掉括号时,它就起作用了: char **p = new char *[vector.size()]; 为什么后一种方法有效?char*p=newchar[10]为大小为10个字符的数组动态分配一个内存块,并返回其第一个元素的地址,然后将其存储到p(使p指向该内存块的开

在创建指向
char
的指针数组时,使用
new[]
运算符时出现问题。由于
char*
是我希望元素的类型,因此我使用括号将其括起来,但它不起作用:

char **p = new (char *)[vector.size()];
但当我去掉括号时,它就起作用了:

char **p = new char *[vector.size()];

为什么后一种方法有效?

char*p=newchar[10]
为大小为10个字符的数组动态分配一个内存块,并返回其第一个元素的地址,然后将其存储到
p
(使
p
指向该内存块的开头)

在这种情况下,
new
关键字后跟一个数组类型说明符,您可以指定类型:
char**p=new char*[10]-本例中的类型是
char*
,而不是
(char*)
。检查

您可能会感到困惑,因为C-style
malloc
语法的返回值类型总是
void*
,可以将其转换为不同的类型,以便您可以取消引用它。这就是使用
(char*)
语法(C-style类型转换)的情况:
char*p=(char*)malloc(10)
尽管请注意,在C中,此强制转换是多余的:


注意,使用
new[]
分配的内存应该通过调用
delete[]
来释放,而
malloc
分配的内存应该通过
free
char*p=new char[10]来释放
为大小为10个字符的数组动态分配一个内存块,并返回其第一个元素的地址,然后将其存储到
p
(使
p
指向该内存块的开头)

在这种情况下,
new
关键字后跟一个数组类型说明符,您可以指定类型:
char**p=new char*[10]-本例中的类型是
char*
,而不是
(char*)
。检查

您可能会感到困惑,因为C-style
malloc
语法的返回值类型总是
void*
,可以将其转换为不同的类型,以便您可以取消引用它。这就是使用
(char*)
语法(C-style类型转换)的情况:
char*p=(char*)malloc(10)
尽管请注意,在C中,此强制转换是多余的:

请注意,使用
new[]
分配的内存应通过调用
delete[]
释放,而
malloc
分配的内存应通过
free

释放。这是“声明后使用”的结果<代码>字符**p
可以理解为“如果我两次解引用p,我将得到一个
char
(char*)*p
左侧没有类型,被解析为表达式,意思是:“取消引用
p
,并将结果强制转换为指向
char
”的指针

char**
单独用作类型名时,类似的约定也适用
(char*)*
根本不作为类型名解析,而是作为表达式解析(因为左侧没有类型)。

这是“声明遵循使用”的结果<代码>字符**p
可以理解为“如果我两次解引用p,我将得到一个
char
(char*)*p
左侧没有类型,被解析为表达式,意思是:“取消引用
p
,并将结果强制转换为指向
char
”的指针


char**
单独用作类型名时,类似的约定也适用
(char*)*
根本不作为类型名解析,而是作为表达式解析(因为左侧没有类型)。

为什么它应该是正确的?!不能在类型周围使用括号,例如
(int)x=2是错误的。指针类型也是如此:
char*p=0
是正确的,
(char*)p=0不是。因为我认为它应该像这个int I;char*p=(char*)i;同意@FerdinandBeyer,有“(int)a”与“int a”相同的意思吗?没有什么要解释的。。。您应该在
新建
之后使用
类型
。在这里,您不需要这样做……但是您可以做
char**p=new(char*[3])所以“不能在类型周围使用括号”的说法并不是100%准确。为什么它应该是正确的?!不能在类型周围使用括号,例如
(int)x=2是错误的。指针类型也是如此:
char*p=0
是正确的,
(char*)p=0不是。因为我认为它应该像这个int I;char*p=(char*)i;同意@FerdinandBeyer,有“(int)a”与“int a”相同的意思吗?没有什么要解释的。。。您应该在
新建
之后使用
类型
。在这里,您不需要这样做……但是您可以做
char**p=new(char*[3])
因此“不能在类型周围使用括号”的说法并非100%准确。您可能想编写“取消引用
p
,并将结果转换为指向
char
”的指针:)@LihO:当然。谢谢以后你可以自己修复这些打字错误(;你可能想写“取消引用
p
,并将结果转换为指向
char
”的指针):@LihO:当然可以。谢谢以后你可以自己修改这些打字错误(;