(考研题)根据给出的有关二级指针程序,求运行结果,并给出理由

 

 

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;

}

 

以上便是分析过程,你可以按照此方法试验性推理,希望对你有帮助😁。