在这段代码中:
int * p = new int(44);
p在堆上分配,它指向的值为44;但现在我也可以这样做:
p[1] = 33;
没有错误。我一直以为
int * p = new int(44);
只是另一种说法“P在堆上分配并指向包含44的地址”但显然它使pa指针指向一个int数组?这个新数组的大小是 44 吗?还是这个结果不寻常。
在这段代码中:
int * p = new int(44);
p在堆上分配,它指向的值为44;但现在我也可以这样做:
p[1] = 33;
没有错误。我一直以为
int * p = new int(44);
只是另一种说法“P在堆上分配并指向包含44的地址”但显然它使pa指针指向一个int数组?这个新数组的大小是 44 吗?还是这个结果不寻常。
你是对的:P 在堆上分配并指向一个包含 44 的地址。没有分配数组。 p[1] = 33;
就是他们所说的“未定义行为”。您的程序可能会崩溃,但不能保证每次执行此操作时都会崩溃。
int *p_scalar = new int(5); //allocates an integer, set to 5.
如果您访问 p_scalar[n] (n <> 0) 它可能会崩溃
在您的示例中,C++ 语言为您提供了指针的下标运算符的默认实现,看起来与此类似:
(*Ptr)& operator[](size_t index)
{
return *(address + index*sizeof(*Ptr));
}
对于任何类型,它总是可以重载和替换。整数也不例外,当你说:
int * pointer = alocate_int_array();
pointer[1] = 1;
您正在使用该运算符的编译器增强默认实现。