首页 > 试题广场 >

运行下面这段C语言程序之后,输出在屏幕上的结果是?

[单选题]
运行下面这段C语言程序之后,输出在屏幕上的结果是:
#include<stdio.h>
void foobar(int a, int *b, int **c)
{
    int *p = &a;
    *p = 101;
    *c = b;
    b = p;
}

int main()
{
    int a = 1;
    int b = 2;
    int c = 3;
    int *p = &c;
    foobar(a, &b, &p);
    printf("a=%d, b=%d, c=%d, *p=%d\n", a, b, c, *p);
    return (0);
}

  • a=1, b=2, c=3, *p=2
  • a=101, b=2, c=3, *p=2
  • a=101, b=101, c=2, *p=3
  • a=1, b=101, c=2, *p=3
  • A: a=1, b=2, c=3, *p=2
  • 函数foobar中的a是按值传递,因此在函数中的修改不会引起主函数中的变化。
  • 函数中b传递的是主函数中b的指针,语句b = p ,其中p指向的是函数foobar内局部变量a的地址,让传递过去的指针换了指向的数据,原来指向的数据(主函数中的b)不会有影响。如果这里是*b = *p那么主函数中的b也要相应变化。
  • 函数中的c传递的是双重指针,*c = b,也就是让主函数中的p指针指向了主函数中的b的地址
  • 在函数foobar中对指针的变化没有影响到主函数,只是让双重指针更换了指向而已
  • 说了半天上个图吧,比较直接。说明:值用=表示,指针用:表示,双重指针用::表示

编辑于 2021-09-10 17:51:07 回复(20)
实际中,函数 foobar改变的一直是地址,而不是地址的值,所以不影响地址里面的值
编辑于 2021-09-10 18:17:38 回复(2)
这个需要大家加强对指针和&的理解,改变一个数据需要一级指针,改变一个一级指针需要二级指针,依次类推,引用就是一个别名
发表于 2015-05-29 20:06:54 回复(1)
选A
foobar函数仅尝试改变a的值,但是a是按值传递的,因此不会影响到主函数中的实参,所以 a不变;至于b,foobar函数只是通过传指针改变了b的指向关系(让b指向了a的地址),而并没有去修改b的值,并且,函数结束后,b又指向了2,因此b也不变;主函数中的c根本没进入foobar,所以不变;p的指向了b指向的地址,而那时b指向的值为2,所以*p是2。
编辑于 2017-07-13 00:28:52 回复(2)
这道题目非常好,考察了很多关于函数参数的知识。本题目当中foobar使用到了3个参数,注意看,这3个参数的不同之处在于,后两者是指针,所以对于指针作为函数参数时的知识,我们必须要掌握。a是本题目当中的一个简单铺垫,考察形参的改变不会修改主程序当中实参的值。而第二个参数是主程序当中变量b的指针,有同学告诉我&b是表示b的引用,这是错误的,在定义函数的参数列表表时,&b才表示引用变量。在调用时表示传递b的地址,指针则是指向b的地址。另外指针传入参数后会产生指针变量本身的一个副本。b=p,表示原本指向b的指针指向了p所指向的对像,对于主程序当中b的值并没有影响。我建议大家画一个foobar内的指针和主程序当中的变量的指向关系图,*c=b表示c让其指向的p指针指向b变量。所以*p的值为2,foobar当中没有**c的赋值,则c的值没有改变。非常好的题目!
发表于 2021-09-02 19:05:38 回复(1)
  • a:传给形参a的是一个值,因此在函数foobar中对形参a的任何操作都不会影响实参,因此结果还是1
  • b:传给形参*b的是实参b的地址(&b),现在形参b指向实参b,而b = p改变的只是形参b所指的对象,实参b并没有改变,因此结果还是2
  • c:在函数中并没有被改变,结果还是3
  • p:传递给形参\*c的是实参p的地址,*c = b解引用c得到实参p,然后p指向指针b所指向的地址,而b又指向实参b,实参b的值为2,因此对p解引用结果为2
    图片说明
发表于 2022-02-22 10:52:30 回复(0)
这题有点绕,a是按值传递,a的值不会修改。b指针等于p也就是函数内的指针,运行完成会销毁,所以也没有得到改变
发表于 2022-07-04 22:45:54 回复(0)
真正起作用的是*c = b,使得*p = 2,其他不影响,故选A。
发表于 2018-11-24 20:43:03 回复(0)
a 是临时变量 所以不会更改 b 是指针 b = p; 只是将b指向别的地址; *p = 101 临时变量a 改为101   *c = b; 将P 指向 2
发表于 2016-08-19 15:47:27 回复(0)
A: a=1, b=2, c=3, *p=2 函数foobar中的a是按值传递,因此在函数中的修改不会引起主函数中的变化。 函数中b传递的是主函数中b的指针,语句b = p ,其中p指向的是函数foobar内局部变量a的地址,让传递过去的指针换了指向的数据,原来指向的数据(主函数中的b)不会有影响。如果这里是*b = *p那么主函数中的b也要相应变化。 函数中的c传递的是双重指针,*c = b,也就是让主函数中的p指针指向了主函数中的b的地址 在函数foobar中对指针的变化没有影响到主函数,只是让双重指针更换了指向而已
编辑于 2020-02-25 13:56:49 回复(0)
画图解题。变量a传递的是值,所以调用foobar不会改变main()里的a,foobar 里对b, *c 的操作都只是改变地址,而并不能改变原变量的值
发表于 2018-04-20 11:28:40 回复(0)
a=1 比较好理解
b=2为什么呢? b的值不是在函数内被改变了吗?
发表于 2015-01-12 15:06:13 回复(2)
实参和形参的赋值,在外界中,int类型,若想改变外界中的值必须传int类型变量的地址,即一级指针,
若想改变外界中一级指针的值,必须传int** 类型,即二级指针。
总结:若想通过函数改变外界中的值,需要传该值的地址。
发表于 2023-10-25 22:29:41 回复(0)
要改变abc的值,就要*a,*b,*c作为左值,才可以改变。
编辑于 2023-09-24 21:48:04 回复(0)
只是改变了他们的指向,没有改变实际的值
发表于 2023-09-16 16:03:08 回复(0)

①a是值传递,不会对主函数有什么影响

②指针传递

int *b = &b; 传送的b的地址

函数形参 主函数实参

int *b = &b;

(函数形参)b = (函数形参)p //bp存放的均是a的地址

但是函数里面的变化,只是形参b发生了变换,主函数中的b不会有影响,

(指针传递要想有影响 *b = *p,比如经典题目,利用指针传参交换两个数的值)

③双指针传递

函数形参 主函数实参

int **c = &p; c存放p的地址

*c就是p

c是int**型

*c是int * 型 形参b也是int *型

*c = b // *c ,b存放的是主函数实参b的地址

即主函数中的p指针,存放主函数实参b的地址

发表于 2023-05-26 10:54:06 回复(0)
每次做这种题,头都晕
发表于 2022-12-29 09:23:04 回复(0)
对于变量b,其实参和形参指向的是相同的地址,但是函数内部改变的是其形参的地址,所以实参b不受改变
发表于 2022-09-23 17:20:21 回复(0)
改变形参的地址,并不会改变原地址中的值
发表于 2022-05-24 21:41:00 回复(0)
考察存储四区,栈区数据由编译器自动分配释放,保存不久。
发表于 2022-03-13 01:26:45 回复(0)