C语言解题——地址返回值

        指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。        

        指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

        指针(pointer)是一个值为内存地址的变量(或数据对象)。正如char类型变量的值是字符,int类型变量的值是整数,指针变量的值是地址。


题目场景:

当参数*x=1, *y=1, *z=1时,下列不可能是函数add的返回值的( )?

int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }

答案输出:

这里只是解析答案的一部分,其中 7 是错误的,函数add的返回值不可能为 7 。


原因分析:

题目实际意图是让判断X,Y,Z 这三个参数是否指向同一地址(三个形参的指针是否指向同一个实参),所以可以分为以下几种类型:

  • X,Y,Z 指向同一地址

由题意知,*x = 1

          *x += *x;

可得到     *x  = 2

进而得到    *y = *y + *x = 2 +2 =4 ;    

//这里为什么 *y变为 2 ,由于 X,Y,Z指向同一地址
//所以当*x  = 2 ,*y 再从其中取值时,取到的就是更改后的值。同理,*Z也是这样的。


进而得到    *z = *z + *y = 4 + 4 =8 ;
  • X,Y,Z 其中任意两个指向同一地址

1、X,Y 指向同一地址

由题意知,*x = 1

          *x += *x;

可得到     *x  = 2

           *y = *y + *X = 2 +2 =4
    
            *Z = *y + *Z = 4 + 1 =5 

2、X,Z 指向同一地址

由题意知,*x = 1

          *x += *x;

可得到     *x  = 2

           *y = *y + *X = 2 +1 =3
    
            *Z = *y + *Z = 3 + 2 =5 

3、Y,Z 指向同一地址

由题意知,*x = 1

          *x += *x;

可得到     *x  = 2

           *y = *y + *X = 1 + 2 =3
    
            *Z = *y + *Z = 3 + 3 =6 

  • X,Y,Z 分别指向不同的地址

由题意知,*x = 1

          *x += *x;

可得到     *x  = 2

           *y = *y + *X = 1 + 2 =3
    
            *Z = *y + *Z = 3 + 1 = 4

代码演示:

#include "StdAfx.h"
#include<stdio.h>
//在VS2010下运行通过
int add(int *x, int *y, int *z){
    *x += *x;
    *y += *x;
    *z += *y;
    return *z;
 }

void main()
{
 //划分三块内存区域
 int a=1,b=1,c=1;
 //注意经过一次add()之后,a,b,c的值有可能发生改变,注意要值要归1
 printf("指向同一内存区域%d\n",add(&a,&a,&a));
 a=1,b=1,c=1;
 printf("指向不同内存区域%d\n",add(&a,&b,&c));
 a=1,b=1,c=1;
 printf("x.y指向同一内存区域%d\n",add(&a,&a,&b));
 a=1,b=1,c=1;
 printf("x.z指向同一内存区域%d\n",add(&a,&c,&a));
 a=1,b=1,c=1;
 printf("y.z指向同一内存区域%d\n",add(&a,&c,&c));
 getchar();
}


代码来自牛客网 writezen 所提供的代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xa_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值