自学内容网 自学内容网

二级指针作为函数参数

一、什么是二级指针

二级指针,即指向指针的指针(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时,会生成一个临时的二级指针的副本pp的值为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)!