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 所提供的代码