C/C++笔记
C/C++笔记
1、指向指针的指针(即2级指针)用处:如果在一个函数内部需要修改指针所指向的数据内容,那就使用指针,如果你要修改指针的指向,那就使用指向指针的指针。
通俗来说,如果我们需要函数的参数是一个地址,而且函数需要修改这个地址,那么我们就要传递2级指针。
int a = 1;
int* p = NULL;
p = &a;
则p是指针的值(即p指向的变量a的地址),*p是p指针指向地址中的那个值。
总之,指针的值是地址没错,但不是指针变量本身的地址,而是它所指向内存单元的地址。
void change(int* p){
*p =*p+1;}//形参*p值的变化可以传回主函数
void main(){
int a = 1;
int* m = &a;
change(&a); //只能改变a的值
change(m); //同样只能改变a的值,而不能改变指针m的值,即指针m指向不变
/*总结:change(m)只能改变指针m指向变量的值,即只能改变指针m指向地址中 的那个值。通俗来说,change(m)只改变了指针m指向的单元的值,而为改变m的 指向(即m值本身,m数值仍然是变量a的地址) */
}
void change(int** p){
...}//形参*p和**p值的变化可以传回主函数
void main(){
int a = 1;
int* m = &a; //即*m=1
change(&m); //int** p,等价于p=&m,*p=m,**p=*m;
/*change(&m)可以通过处理change函数中*p和**p值改变主函数中m和*m的值 即通过二级指针可以改变一级指针的指向(即指针的值或指针指向的内存单元地址),可以改变一级指针指向变量的地址。 */
二级指针反映在链式顺序结构的单链表中就是:
change1.c:
change1(LinkList **p1){
...} //能传回*p1和**p1的改变(到主函数)
change2.c:
change2(LinkList *p2){
...} //能传回*p2的改变(到主函数)
main.c
LinkList *mylist; //mylist是头指针,
//&mylist的值是头指针的地址,mylist的值是第一个结点的地址,
//*mylist是第一个结点的内容(即第一个节点的值)
change1 (&mylist); //&mylist=p1,mylist=*p1,*mylist=**p1,
//即此调用可以改变mylist和*mylist,即该调用可以改变第一个
//结点的地址和第一个结点的内容,即可以改变头指针的指向以及
//头指针指向单元的内容
change2 (mylist); //mylist=p2,*mylist=*p2;
//只能改变第一个结点的内容(包括data和Next),即只能改变第一个
//结点的数据和指针,即只能改变头指针指向的结点的数据和指针(值),
//头指针的指向则无法改变
举例:彻底理解链表中为何使用二级指针或者一级指针的引用https://blog.csdn.net/u012234115/article/details/39717215