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