我是初学者,这个问题总是让我困惑。我的学术书籍说
new
运算符返回一个地址。但在很多教程中,我发现new
返回一个指向特定地址的指针。拿这个:
char *name = new char[x];
这里给
name
赋的是什么值,是已经动态分配的地址还是指向动态分配的指针char
?
指针是一个包含另一个变量地址的变量。所以这两种说法大致相同。返回包含地址的指针。
当你说指针指向某个东西时,这意味着它包含它的地址。
operator new 返回一个指向数组开头的pointer。
指针是内存中某个单元的地址。
这就是为什么我们可以说:运算符 new 返回一个地址到数组的开头。
对不起我的英语。
简而言之:new 运算符返回分配对象的唯一地址。当您分配对象数组时,将返回第一个对象的地址。
char *name = new char[x];
// name is a char pointer that contains the address to the first char from your char array
name[0]
访问数组的第一个元素。
name[1]
访问数组的第二个元素。
数组形式的 new 表达式(如
new char[x]
)的结果是一个指针(在本例中为 char *
类型)。当使用运算符new
的数组形式时,该指针的值是动态分配数组的第一个元素的地址。当使用非数组形式(如new char
中)时,会分配单个对象,并且指针的值等于该对象的地址。
语句
name
分配的变量char *name = new char[x]
的值是表达式new char [x]
给出的指针的值。
如果在分配过程中发生错误,则operator new会抛出异常而不是返回值,并且变量
name
永远不会收到值。 [这可以通过使用运算符 new 的替代形式来更改,该运算符在错误时返回 NULL
,并且不会抛出异常,但您还没有这样做]。
数组新表达式
new T[N]
的值是大小为 N
为 T
的动态分配数组的第一个元素的地址。该值的类型是T *
,即该地址的指针类型。
数组对象本身通常是不可寻址的,并且您通常无法命名完整的对象(事实上,您甚至不能说出它的type)。您只能命名其每个元素子对象,并且只能通过其第一个元素的地址销毁和释放数组对象。
表情
new char[x]
分配
char
对象的数组,并返回指向索引零处的对象的指针(类型为 char*
)。
如果你想动态分配指针,你可以使用
new char*
动态分配
char*
类型的对象,并返回指向它的指针(char**
类型)。