今日在看视频学东西时,大量用到二级指针,于是便查阅资料对指针进行了研究总结。
1. 为什么会用到指针(或引用)?在一个函数的执行中,局部变量发生的变换不会作用在函数外(且值传递浪费内存)。因此便用到了指针(或引用)来通过地址传递从而使函数的执行结果对全局都有影响。
2. 为什么会用到二级指针(或指针引用)?a、例如一个通讯录系统,一个大的系统里面,有多个对象需要修改,而每个对象里面又有多个值需要修改,因此这里便需要通过多层指针来嵌套。即多维数组中的参数传递(此处的系统下的对象便为二级指针)。
b、对指针进行 *** 作(修改、释放内存空间等)对于一个正常的指针变量(等同于系统中每个对象里面的属性),你可以在函数体中对其指向的值进行修改,如下图:
但若你想修改p指向的地址来修改其中的值(也就是说,把指针当成变量,修改指针)(系统中的每个对象),如下图
可以发现,值并没有发生改变。
因此,为了改变p指向的地址,此处引入二级指针。
3. 如何使用二级指针void change(int** pp) { int* c = new int(20); *pp = c;//这里的**pp指向p指针指向的内容而*pp指向p指针 } int main() { int a = 10; int* p = &a; int** pp = &p; change(pp); cout << "a=" << a << endl; cout << "p=" << p << endl; cout << "&a=" << &a << endl; cout << "*p=" << *p << endl; cout << "**p=" << **pp << endl; system("pause"); return 0; }
其结果如下
可知,在二级指针下,将p的内容改成了int(20)的地址,从而p在解引用时,其值变为了20。
cpp中提供了相比二级指针更好的概念——指针引用,可以通过指针引用来不那么绕地模拟二级指针,对一级指针的内容进行修改,其修改如下:
void change(int* &pp) { pp = new int(20); } int main() { int a = 10; int* p = &a; change(p); cout << "a=" << a << endl; cout << "p=" << p << endl; cout << "&a=" << &a << endl; cout << "*p=" << *p << endl; system("pause"); return 0; }
本代码中,即将p取个别名pp,对pp的修改就是对指针p的修改,既可以修改其p的地址也可修改其p指向的内容。其结果与上文一样。
a、指针就是地址,而*符号在地址的左边便是获得地址对应的值。
b、引用就是给变量起别名,但其内部的本质是指针常量(即地址不变,内容可变)。而指针引用的定义格式为int* &p,其中int*是数据类型,&是引用要求,p是别名。
c、在上述的代码中,无论是用指针引用还是二级指针的方法,一旦对p进行修改,会导致p与a脱钩,此时若再出现一个函数使*p=40,那么a也仍为10。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)