在创建new[]
指向char
. 由于char*
是我希望元素的类型,因此我使用括号将其括起来,但它不起作用:
char **p = new (char *)[vector.size()];
但是当我去掉括号时它会起作用:
char **p = new char *[vector.size()];
为什么后一种有效?
在创建new[]
指向char
. 由于char*
是我希望元素的类型,因此我使用括号将其括起来,但它不起作用:
char **p = new (char *)[vector.size()];
但是当我去掉括号时它会起作用:
char **p = new char *[vector.size()];
为什么后一种有效?
char *p = new char[10];
为大小为 10 个字符的数组动态分配内存块,并返回其第一个元素的地址,然后将其存储到其中p
(p
指向该内存块的开头)。
在这种情况下,new
关键字后跟一个数组类型说明符,您指定类型:
char **p = new char*[10];
- 在这种情况下,类型是char*
,不是(char*)
。检查运算符 new[]
您可能会因为 C 风格的malloc
语法而感到困惑,其中返回值的类型总是void*
,可以将其转换为不同的类型,以便您可以取消引用它。这就是您使用(char*)
语法(C 风格类型转换)的情况:char *p = (char*) malloc(10);
虽然请注意在 C 中这种转换是多余的:我是否转换 malloc 的结果?
请注意,使用分配的内存new[]
应通过调用释放,delete[]
分配的内存malloc
应由 释放free
。
这是“声明遵循使用”的结果。char **p;
可以读作“如果我取消引用 p 两次,我将得到一个char
”。(char*) *p
左边没有类型,并被解析为表达式,意思是:“取消引用p
并将结果转换为指向char
”的指针。
当char **
单独用作类型名称时,类似的约定成立。(char*) *
根本不解析为类型名称,而是解析为表达式(因为左侧没有类型)。