指针的意义是什么? 当C++可以声明变量时,指针的意义是什么?什么时候使用它们合适?

指针的意义是什么? 当C++可以声明变量时,指针的意义是什么?什么时候使用它们合适?,c++,pointers,C++,Pointers,有时您的函数需要返回一些未设置的内存量,例如读取文件 bool ReadDataFromFile(char** contents); 您将声明一个char*contents并将该指针的地址传递给函数。然后,该函数将分配内存,返回时指针将指向内容 指针在处理编译时大小和形状未知的数据结构时最有用(想想列表、树、图、数组、字符串等等) 编辑 这些相关答案可能也会有所帮助(第二个链接中的顶部答案绝对值得一看): 指针也非常适合将可变参数传递给函数,以便调用者“看到更改”。你可能会想,“但为什么不使

有时您的函数需要返回一些未设置的内存量,例如读取文件

bool ReadDataFromFile(char** contents);

您将声明一个char*contents并将该指针的地址传递给函数。然后,该函数将分配内存,返回时指针将指向内容

指针在处理编译时大小和形状未知的数据结构时最有用(想想列表、树、图、数组、字符串等等)

编辑

这些相关答案可能也会有所帮助(第二个链接中的顶部答案绝对值得一看):


指针也非常适合将可变参数传递给函数,以便调用者“看到更改”。你可能会想,“但为什么不使用引用?”。我喜欢谷歌的观点:


我在学习指针时遇到了完全相同的问题,它们似乎并不重要,但随着你的进步,你会发现它们有时非常有用

指针通常用于编程情况。例如,当您按名称引用数组时,例如

数组[i]=3;
编译器正在做一些奇特的数学运算,最终将代码转换为

(数组地址)+(sizeof(数组元素)*i)=3


它们还使树、链表和其他数据结构成为可能,您将在了解更多信息时了解这些信息。

指针最好通过C&C++在变量传递给函数方面的差异来理解

是的,您可以传递整个变量,也可以只传递指向它的指针(行话分别是通过值或引用)

但是,如果变量是20兆字节数组,比如您决定将整个文件读入一个数组,该怎么办?按值传递它将是愚蠢的:为什么要为此操作复制20兆欧,而如果最终修改它(即,它是一个out参数),则必须将该20兆欧复制回来

最好只是“指向”它。你说,“这里有一个指向一个大内存块的指针”。而这个小小的间接操作节省了大量的时间

一旦你明白了这一点,其他一切基本上都是一样的。重新排列列表中的项目只不过是交换指针,而不是复制周围的每个项目,开始时,您不需要知道事情有多大,等等

C++引用与中的指针不同 几个基本方法:

  • 之后不可能直接引用引用对象 它是有定义的;其任何事件 名称直接指它所属的对象 参考资料
  • 一旦创建了引用,以后就无法对其进行引用 另一个对象;我们说不可能 重置。这通常是通过 指针
  • 引用不能为null,而指针可以;每一个参考都提到 对于某个对象,尽管它可能或可能 无效
  • 不能取消初始化引用。因为这是不可能的 重新初始化引用时,它们必须 一旦它们被初始化 创建。特别是本地和 必须初始化全局变量 定义它们的位置,以及引用 哪些是类的数据成员 实例必须在 类的初始值设定项列表 构造器
有了以上的限制,指针就是引用对象的轻量级容器的全部,特别是当您使用多态或动态进行操作时。代表窗口的纯抽象类指针的动态数组就是一个例子

因为我懒得去想一个多态性的例子,所以我将从下面的例子中抽取一个:

//指向基类的指针
#包括
使用名称空间std;
类CPolygon{
受保护的:
int宽度、高度;
公众:
无效集合_值(整数a、整数b)
{宽度=a;高度=b;}
};
类CRectangle:公共CPolygon{
公众:
整数区域()
{返回(宽度*高度);}
};
类CTriangle:公共CPolygon{
公众:
整数区域()
{返回(宽度*高度/2);}
};
int main(){
斜角直肌;
CTriangle trgl;
CPolygon*ppoly1=▭
CPolygon*ppoly2=&trgl;
ppoly1->设置_值(4,5);
ppoly2->设置_值(4,5);

cout在最基本的层次上,指针允许您关联不相交的内存块指针可以帮助您的示例是在一个需要10000000000个整数数组的算法中。如果我尝试以下定义,这样的数组将太大,无法放入我正在键入的机器的RAM中:

int bigMatrix[1000000000000]; // I can't allocate this much contiguous memory
但是,如果我创建一个指针数组,我可以将子数组保留在一个中等大小的磁盘阵列上

int *bigMatrix[1000000]; // Each pointer refers to a sub-array 
                         // of 1000000 elements on disk

诚然,如果用户需要,我必须在这些子数组中编写代码,包括将数组符号隐藏在访问器方法后面。也就是说,指针允许我在需要时创建所需的特殊关联。

除了效率和灵活性之外。C/C++中指针的要点是这就是硬件的工作原理,如果不使用指针,就无法使用设备驱动程序、内存管理器或高效缓存

第一个C编译器的主要设计目标之一是成为一种“可移植的汇编语言”,并且能够在更高级别的语言中使用传统的汇编/机器代码进行任何操作。这意味着能够直接操作地址,这就是指针的意义


但是,遵循KISS原则不要使用指针,除非它们真的使事情变得更简单。

从体系结构的角度来看,指针是建模0..n关系的经济方法:

struct A {
  vector<const B *> *pBees;
  A() : pBees(nullptr) {}
  void notice_bee(const B *pB) { 
    if (!pBees)
      pBees = new vector<const B *>;
    pBees.push_back(pB)
  }
  ~A() { 
    delete pBees; // no need to test, delete nullptr is safe
  }
  size_t bees_noticed() { return pBees ? pBees->size : 0 }
};
结构A{ 向量*pBees; A():pBees(nullptr){} 无效通知书(常数B*pB){ 如果(!pBees) pBees=新向量;
struct A {
  vector<const B *> *pBees;
  A() : pBees(nullptr) {}
  void notice_bee(const B *pB) { 
    if (!pBees)
      pBees = new vector<const B *>;
    pBees.push_back(pB)
  }
  ~A() { 
    delete pBees; // no need to test, delete nullptr is safe
  }
  size_t bees_noticed() { return pBees ? pBees->size : 0 }
};
char Document[10000]; char* pDocument = new char[getSizeOfDocument()];
int array[100];
int *array = new int[size];
// do stuff
delete [] array;