1.
#include<stdio.h>
void func(int **x,int **y)
{
int **tmp=y;
*x=*tmp;
**x=3;
}
int main()
{
int a=1,b=2;
int *ap=&a,*bp=&b;
func(&ap,&bp);
printf("a=%d,b=%d\n",a,b);
return 0;
}
2.
#include<stdio.h>
void func(int **x,int **y)
{
int *tmp=*x;
**y=*tmp;
*tmp=100;
}
int main()
{
int a=1,b=10;
int *ap=&a,*bp=&b;
func(&ap,&bp);
printf("a=%d,b=%d\n",a,b);
return 0;
}
3.
#include<stdio.h>
void func(int **x,int **y)
{
int tmp1=**x;
int *tmp2=*y;
**x=tmp1+*tmp2;
tmp2=*x;
**y=tmp1-*tmp2;
}
int main()
{
int a=0,b=1;
int *ap=&a,*bp=&b;
func(&ap,&bp);
printf("a=%d,b=%d\n",a,b);
return 0;
}
4.
#include<stdio.h>
void func(int *x,int **y)
{
int tmp=*x;
*y=&tmp;
**y=1000;
*x=tmp;
}
int main()
{
int a=1,b=10;
int *ap=&a,*bp=&b;
func(ap,&bp);
printf("a=%d,b=%d\n",a,b);
return 0;
}
二级指针,解引用一次是操作指针指向,解引用两次是操作所指向空间的值
对于函数
void func(int **x,int **y)
分析x、y的二级指针。
变量:具有地址,存储数据。
指针:具有地址,存放变量的地址。
二级指针:具有地址,存放指针的地址。即指针的指针。
因此,对于二级指针有如下关系:
这里我用 v1 表示x最终指向的空间,p1表示x所指向的指针,同理v2为y最终指向的变量的空间,p2为y所指向的指针。则个函数的分析如下:
A选项:
// 函数功能:把 v2 修改为 3
void func(int** x, int** y)
{ // v1 v2
// p1 p2
int** tmp = y;
// tmp -> p2
*x = *tmp;
// p1->p2
**x = 3;
// v2 = 3
}
int main()
{
int a = 1, b = 2;
int* ap = &a, * bp = &b;
func(&ap, &bp);
printf("a=%d,b=%d\n", a, b); // 输出 a=1,b=3
return 0;
}
B选项:
// 功能: v2 = v1, v1 = 100
void func(int** x, int** y)
{ // v1 v2
// p1 p2
int* tmp = *x;
// tmp = p1
**y = *tmp;
// v2 = v1
*tmp = 100;
// v1 = 100
}
int main()
{
int a = 1, b = 10;
int* ap = &a, * bp = &b;
func(&ap, &bp);
printf("a=%d,b=%d\n", a, b); // a=100,b=1
return 0;
}
C选项:
// 功能:v1 = v1+v2, v2 = -v2
void func(int** x, int** y)
{ // v1 v2
// p1 p2
int tmp1 = **x;
// tmp1 = v1
int* tmp2 = *y;
// tmp2->p2
**x = tmp1 + *tmp2;
// v1 = v1 + v2
tmp2 = *x;
// tmp2->p1
**y = tmp1 - *tmp2;
// v2 = tmp1 - v1 = 原v1 - 现v1
// = v1 - (v1 + v2) = -v2
}
int main()
{
int a = 0, b = 1;
int* ap = &a, * bp = &b;
func(&ap, &bp);
printf("a=%d,b=%d\n", a, b); // a=1,b=-1
return 0;
}
D选项:
// 功能: v1 = 1000,
void func(int* x, int** y)
{ // v1 v2
// p2
int tmp = *x;
// tmp = v1
*y = &tmp;
// p2 = &tmp 即y最终所指向的空间变成 tmp
**y = 1000;
// tmp = 1000
*x = tmp;
// v1 = tmp
// v1 = 1000
}
int main()
{
int a = 1, b = 10;
int* ap = &a, * bp = &b;
func(ap, &bp);
printf("a=%d,b=%d\n", a, b); // a=1000,b=10
return 0;
}
以上便是分析过程,你可以按照此方法试验性推理,希望对你有帮助😁。