C++中new的语法与使用

C++ 中的 new ,它是用于动态分配内存的关键字。让我们从零基础的角度来阐述 new 的作用。

在 C++ 中,内存可以静态分配和动态分配。静态分配指的是在编译时为变量分配固定的内存空间,而动态分配则是在程序运行时根据需要分配内存空间。
使用 new,可以在运行时动态地分配内存空间,并返回得到分配的内存块的地址。这个过程被称为动态内存分配。

下面是一个简单的示例,演示了 new 的基本用法:
int* p = new int;
*p = 10;
// 后续操作...
delete p;

在上述示例中,使用 new 创建了一个新的 int 类型的对象,该对象被分配在堆上,并返回了一个指向该内存块的指针(这里是 p)。可以通过 *p 来访问和操作这个动态分配的整数对象。

int* p = new int;

这行代码的意思是,我们声明了一个名为 p 的指针变量,它指向一个动态分配的 int 类型对象。

让我们逐步解释上述代码:

  • int* p:这是一个声明语句,我们声明了一个指针变量 p,它可以指向 int 类型的对象。
  • new int:使用 new 运算符动态分配了一个 int 类型的内存空间。这里没有指定具体的大小,因此动态分配的空间将被初始化为默认值,对于 int 来说,即为 0。
  • = new int:将动态分配的内存块的地址赋值给指针变量 p。
  • 通过这一行代码,我们创建了一个动态分配的 int 类型对象,并将其地址存储在指针变量 p 中。我们可以通过 *p 来访问和操作该动态分配的对象。
  • 需要注意的是,使用 new 动态分配的内存块在不需要时需要手动释放,以防止内存泄漏。在示例中,使用 delete 来释放动态分配的内存空间。
除了分配单个对象之外,new 还可以用于动态分配数组。下面是一个创建动态数组的示例:
int* arr = new int[5];
// 对数组进行操作...
delete[] arr;
  • 在上述示例中,使用 new 动态分配了一个包含 5 个 int 元素的数组,并将分配的内存地址存储在 arr 指针中。可以通过 arr[i] 访问和操作数组的元素。类似地,动态分配的数组在不需要时需要使用 delete[] 来释放内存。

  • 总而言之,newC++ 中用于动态分配内存的关键字。通过使用 new,我们可以在运行时动态分配对象和数组的内存空间,并通过返回的指针来控制和操作这些动态分配的内存块。记得在使用完毕后手动释放这些内存,以避免内存泄漏。

思考:*p为什么能访问和操作到该动态分配的对象呢?它是如何做到的?
*p 是通过指针解引用操作符 * 来访问和操作动态分配的对象的
  • C++ 中,使用指针解引用操作符 * 可以访问指针所指向的对象。也就是说,*p 表示访问指针 p 所指向的内存地址上的值。

  • 在我们的例子中,p 是一个指向动态分配的 int 对象的指针。所以,*p 实际上就是访问和操作了这个动态分配的 int 对象。

让我们通过一个示例来更好地理解:
int* p = new int;
*p = 10;
std::cout << *p; // 输出 10
  • 在上述示例中,我们首先使用 new 动态分配了一个 int 对象,并将其地址存储在 p 指针中。然后,通过 *p = 10,将值 10 赋给了动态分配的 int 对象。最后,通过 *std::cout << p,使用指针解引用操作符 * 来访问并输出了动态分配的 int 对象的值。

  • 在这个例子中,通过 *p 可以像操作普通的 int 变量一样来操作动态分配的 int 对象。这是因为指针 p 存储了动态分配对象的地址,通过解引用操作符 *,可以访问和操作这个地址上的值。

  • 需要注意的是,只有指向有效动态分配内存的指针才可以使用解引用操作符 *。如果尝试解引用一个空指针或无效指针,将导致运行时错误。

  • 总而言之,通过指针解引用操作符 *,可以访问和操作指针所指向的动态分配的对象。它是通过指针存储的内存地址来实现的。这使得操作动态分配的对象和操作普通变量一样简单。

你可能感兴趣的:(C/C++,c++,new,指针)