m0_54392386 2021-01-25 19:57 采纳率: 100%
浏览 3
已采纳

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

 

 

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;
  
}

 

  • 写回答

1条回答 默认 最新

  • 我叫RT 2021-01-25 21:34
    关注

    二级指针,解引用一次是操作指针指向,解引用两次是操作所指向空间的值

    对于函数

    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;
    
    }

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 请阅读下面代码,帮我修改下代码
  • ¥15 关于#microsoft#的问题:电脑启动后不显示桌面图标和窗口,除任务栏外无法操作任何东西
  • ¥15 如何输入百度,显示本地下载的html文件页面,地址栏还显示百度的地址
  • ¥15 通过kinect制作换装程序但是服装不贴合(标签-ar)
  • ¥20 matlab如何绘制三维瀑布图
  • ¥15 关于用abap来解决动态规划的问题,但是要求输出索引值,这个是难点
  • ¥15 在ISIS中什么是IP从地址
  • ¥15 压测时,并发量过高时,响应时间出现尖刺
  • ¥15 关于vmprotect3.8.4虚拟文件一项
  • ¥15 在不用IT调试的情况下怎样能连外网