此片给小白看,高手请自动略过。
1.我的理解:(在一切的开始我们就先明确一点指针就是一个地址)(一个让你找到你想找到的变量的东西,当然有时候他没有一个变量名)
在c/cpp中指针一概念让人头疼,在我的理解,其实指针顾名思义可以是就是一个索引而已,所谓双指针算法里的指针不也是索引罢了吗,你可以把它看作一种索引型数据类型,什么意思呢?可以看一下代码。
#include<iostream>
struct person{
string name;
int age;
person():name("jing"),age(22){}
};
int main()
{
int a=100;
int*p_a=&a;
person jing;
person *p_jing=&jing;
std::cin.get();
}
这同样不是很直观的。所以当你学到链表(一个由地址串连的线性表(所谓线性表就是像一条线一样储存数据))可以看看代码一个有头的单向链表。先可以看看图片。
template<class T>
struct node{
T data
node*next;
node(T x):data(x),next(null){}
node():next(NULL){}
};
template<class T>
class linkedlist{
private:int size;
node<T>*head;
public:linkedlist():size(0),head(nullptr){}
~linkedlist();
void insert(int i.T value);
};
这是一个简单链表的结点用一个泛型编程所表达,其实我想表达的是在结点可以加任何东西(当然这是无所欲为的)但是需要遵守effective c++,以及设计模式原则,在图解你可以清晰看到指针的用处。当然这只是一个单向的链表。这很简单。在此有第二种用法普及。就是所谓在堆上开始一个空间。这就是要用到new delete 或者可以说malloc free。
那么首先,我们的内存使用分为堆和栈,栈是我们平常写代码的地方,一般它会随着作用域的结束而释放,但new可以在堆上请求一片内存,并且你得在作用域结束前释放它,不然会造成内存泄漏,当然你可能觉得在一个接口函数内浪费几个内存这并不恐怖,当然可以提提函数的概念,为什么要用模块方式编程,省时间省代码,如果你要写一个接口你必然会使用他超过俩次以及以上写多文件并不是让你炫技,这并不好笑,那么你成千上万次调用这个接口如果是10000个字节的泄露就是10000*10000,奥,你可以使用的内存会比变得微乎其微。回到正题上,既然是内存我们就有一个地址去接收它。
例如 int* p_array=new int[100];当然你也可以看作这个去往堆上的索引,当然我们用p_array[n]去访问它,或许你可以这么做int**p_array=new int*[100];哦,这是给不错的例子让你去理解它。
二级指针吼吼,你被 吓到了吧!那么可以看一下代码。
#include<iostream>
struct point_inter{
int *P_data;
};
int main()
{
point_inter*p_pi=new point_inter[100];
std::cin.get();
}
或许你可以看看我的基础数据结构来想清楚这一切(sorry 暂时还没想到怎么去写)。
上面我们说了那么多还没开始写点什么。去写一个单向链表吧。我想说的是链表除了它的索引并不重要,它可以储存一切(详情请参阅我未完成的我对基础数据结构的理解)。请大佬多多指点指针用处。