视频字幕
指针是C++中的重要概念,它是存储内存地址的变量。每个变量在内存中都有一个地址,指针就是用来存储这个地址的。比如变量x存储在地址0x1002,值为42。指针ptr存储x的地址,通过解引用操作符星号,我们可以通过指针间接访问变量的值。
指针是存储内存地址的变量。在这个例子中,elements是一个指针,它存储的值是内存地址,比如0x1000。这个地址指向动态分配的数组的第一个元素。通过指针,我们可以访问整个数组的内容。
顺序表的结构体定义包含三个成员:elements是一个指针,指向动态分配的数组;size记录当前元素个数;capacity记录数组容量。在内存中,结构体的各个成员按顺序存储。elements指针存储的是数组首地址,通过这个地址可以访问整个数组。当我们有结构体指针时,使用箭头操作符访问成员,比如list箭头elements。
动态内存分配使用new操作符。初始时,elements指针的值是NULL,表示不指向任何内存。当执行new eletype[capacity]时,系统在堆内存中分配一块连续的空间,能够存储capacity个元素。new操作符返回这块内存的首地址,赋值给elements指针。现在指针就指向了动态分配的数组。
插入操作需要在指定位置插入新元素。比如要在索引2的位置插入15,首先需要将索引2及其后面的元素都向后移动一位,为新元素腾出空间。然后将新元素15放入索引2的位置。如果数组已满,还需要先进行扩容操作,分配更大的数组空间。
内存管理非常重要。使用new分配的内存必须用delete来释放。delete操作释放指针指向的内存空间,使其可以被系统重新使用。释放后,应该将指针设置为null,避免野指针的问题。忘记释放内存会导致内存泄漏,而使用已释放的内存则会导致程序崩溃。
动态内存分配是C++中的重要概念。initializelist函数使用new操作符在堆内存中分配数组空间。栈内存存储局部变量和结构体,由系统自动管理。堆内存需要程序员手动管理,使用new分配,用delete释放。elements指针存储在栈中的结构体里,但它指向堆内存中动态分配的数组。这种设计允许数组大小在运行时确定。
插入操作涉及复杂的内存管理。首先检查当前容量是否足够。如果数组已满,需要扩容:分配一个容量翻倍的新数组,将原数据复制过去,释放原数组,更新指针指向新数组。然后进行元素移动:从插入位置开始,将后面的元素依次向后移动一位,为新元素腾出空间。最后将新元素插入到指定位置。这个过程体现了指针操作和内存管理的重要性。
让我们跟踪main函数的完整执行过程。首先初始化顺序表,elements指针指向容量为10的动态数组。然后插入10个元素,数组被填满。接着删除索引5的元素50,后面的元素向前移动。更新索引1的元素为1314。查找元素20并更新为520。最后调用destroylist函数,使用delete释放动态分配的内存,避免内存泄漏。整个过程展示了指针如何管理动态内存,以及各种数组操作如何通过指针实现。