二级指针作为函数参数
一、什么是二级指针
二级指针,即指向指针的指针(pointer to pointer),也叫双重指针(double pointer),用来存储另一个指针的地址。
下图可以比较清晰的理解二级指针的概念:变量var
中存储整数10
,指针ptr1
存储变量var
的地址2008
,指针ptr2
存储指针ptr1
的地址4020
,指针ptr2
就是二级指针。
二级指针的声明
二级指针的声明和普通指针的声明类似,只不过在指针变量前有两个*
。
data_type_of_pointer **name_of_variable = & normal_pointer_variable;
int val = 5;
int *ptr = &val; // storing address of val to pointer ptr.
int **d_ptr = &ptr; // pointer to a pointer declared
// which is pointing to an integer.
Example 1
// C program to demonstrate pointer to pointer
#include <stdio.h>
int main()
{
int var = 789;
// pointer for var
int* ptr2;
// double pointer for ptr2
int** ptr1;
// storing address of var in ptr2
ptr2 = &var;
// Storing address of ptr2 in ptr1
ptr1 = &ptr2;
// Displaying value of var using
// both single and double pointers
printf("Value of var = %d\n", var);
printf("Value of var using single pointer = %d\n", *ptr2);
printf("Value of var using double pointer = %d\n", **ptr1);
return 0;
}
Output
Value of var = 789
Value of var using single pointer = 789
Value of var using double pointer = 789
二级指针作为函数参数
🍋 一级指针作为函数参数
Example 2
#include <stdio.h>
int a = 10;
int b = 100;
void func(int *p)
{
p = &b;
}
int main(void)
{
int *q = &a;
printf("before func: %d\n",*q);
func(q);
printf("after func: %d\n",*q);
return 0;
}
Output
before func: 10
after func: 10
对于上面的例子,函数func
并没有改变指针q
所存储的地址的值,所以输出结果为10
。如果我们想要改变指针所存储的地址的值,就需要使用二级指针。
🍌 二级指针作为函数参数
Example 3
#include <stdio.h>
int a = 10;
int b = 100;
void func(int **p)
{
*p = &b;
}
int main(void)
{
int *q = &a;
printf("before func: %d\n",*q);
func(&q);
printf("after func: %d\n",*q);
return 0;
}
Output
before func: 10
after func: 100
对于上面的例子,函数func
的参数是二级指针,最终输出结果为100
,改变了指针q
所存储的地址的值。
🍉 解释
一级指针作为函数参数没有改变*q
的值的原因:如下面的代码所示,指针变量q
作为参数传给函数func
时,在函数内部生成了一个指针变量q
的临时的副本p
,改变这个副本p
的值并不会改变q
的值,所以函数func
运行以后,q
的值并没有发生改变,所以输出的*q
的值和函数运行以前是一样的。
#include <stdio.h>
int a = 10;
int b = 100;
void func(int *p)
{
printf("address of p is: %p\n", &p);
p = &b;
}
int main(void)
{
int *q = &a;
printf("address of q is: %p\n", &q);
printf("before func: %d\n",*q);
func(q);
printf("address of q is: %p\n", &q);
printf("after func: %d\n",*q);
return 0;
}
Output
address of q is: 0x7fffffffd628
before func: 10
address of p is: 0x7fffffffd608
address of q is: 0x7fffffffd628
after func: 10
二级指针作为函数参数可以改变*q
的值的原因:如下面代码所示,向函数func
传递参数&q
时,会生成一个临时的二级指针的副本p
,p
的值为q
的地址,即P
指向q
,*p
就是q
(代码中输出的*p
的地址和p
的地址相同),所以改变*p
的值就会改变q
的值。
#include <stdio.h>
int a = 10;
int b = 100;
void func(int **p)
{
printf("address of *p is: %p\n", &*p);
*p = &b;
printf("address of *p is: %p\n", &*p);
}
int main(void)
{
int *q = &a;
printf("address of q is: %p\n", &q);
printf("before func: %d\n",*q);
func(&q);
printf("address of q is: %p\n", &q);
printf("after func: %d\n",*q);
return 0;
}
Output
address of q is: 0x7fffffffd628
before func: 10
address of *p is: 0x7fffffffd628
address of *p is: 0x7fffffffd628
address of q is: 0x7fffffffd628
after func: 100
即:一级指针改变的是在函数内部产生的指针的副本;二级指针改变的是在函数内部产生的二级指针的副本所指向的地址,即改变了一级指针,即q
发生了改变。
原文地址:https://blog.csdn.net/qq_40178082/article/details/144069179
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!