指针是保存内存位置地址的变量。我们知道声明的所有变量在内存中都有一个特定的地址。声明一个指针变量来指向内存中的这些地址。声明指针变量的一般语法是123intp, *ptr;//声明变量p和指针变量ptrp 4;//赋值4给变量pptr p;//将p的地址分配给指针变量ptr在内存中这些声明将表示如下这是指针在内存中的内部表示。当地址变量分配给指针变量时它指向的变量如上图所示。由于ptr具有变量 p 的地址*ptr将给出变量 p 的值指针变量 ptr 指向的变量。为什么需要 C 中的指针为了解释对指针的需要有必要回到基本内存布局。每当执行程序时程序指令都会驻留在代码段中。并且所有的方法和数据都将驻留在堆栈中。代码部分只能访问堆栈部分但不能直接访问堆部分。注意由于代码段不能直接访问堆段所以不能直接使用堆内存会被浪费掉造成栈内存溢出。使用指针可以解决这个问题。指针为代码部分提供了对堆内存的间接访问在堆栈部分创建一个指针该指针指向堆部分的内存地址从而间接访问堆部分。C 中使用指针的动态内存分配在堆部分分配内存发生在运行时而不是在编译时因此分配堆内存称为动态内存分配。一般来说C不会在堆中分配一个内存因为在使用指针时通常会遇到的复杂性。所以只分配一个内存块我们就要使用堆内存比如对于数组我们会进行动态内存分配。在 C 中new运算符用于在运行时分配内存内存以字节为单位分配。该新操作符表示用于在堆动态存储器分配的请求。如果有足够的内存可用则new运算符初始化内存并将新分配和初始化的内存的地址返回给指针变量。语法1datatype *pointer_name newdatatype具体例子123456int*ptr newint;//在动态分配时我们可以通过以下两种方式声明一个变量。int*ptr newint(10);int*ptr newint{15};// new运算符还用于分配数据类型的内存块数组。int*ptr newint[20];// 上面的语句为int类型的20个整数连续动态分配内存并返回指向序列的第一个元素指向“ptr”指针。一旦使用new关键字将堆内存分配给变量或类对象我们就可以使用delete关键字释放该内存空间。动态内存分配概念的主要用途是通过指定其大小来声明数组但不确定它时将内存分配给数组。看一个例子来理解数组的内存分配用法。1234567891011121314151617181920#include iostreamusingnamespacestd;intmain(){intlen, sum 0;cout Enter the no. of students in the class endl;cin len;int*marks newint[len];//Dynamic memory allocationcout Enter the marks of each student endl;for(inti 0; i len; i){cin *(marks i);}for(inti 0; i len; i){sum *(marks i);}cout sum is sum endl;return0;}在代码中首先询问用户一个班级的学生人数并将其值存储在 len 变量中。然后声明一个整数数组并使用此语句在内存中动态分配等于 len 变量中存储的值的空间int *marks new int[length];因此它被分配了一个等于“长度*1个整数的大小”的空间。