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-stylemalloc
语法的返回值类型总是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-stylemalloc
语法的返回值类型总是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:当然可以。谢谢以后你可以自己修改这些打字错误(;