首页 > 试题广场 >

有以下程序,程序的输出结果是?

[单选题]

有以下程序

#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *p2, int *s) {
    s = (int *)malloc(sizeof(int));
    *s = *p1 + *(p2++);
}
int main() {
    int a[2] = {1, 2}, b[2] = {10, 20}, *s = a;
    fun(a, b, s);
    printf("%d \n", *s);
}

程序运行后的输出结果是?

  • 11
  • 10
  • 1
  • 2
推荐
本题考查把数组名作为函数参数,执行fun函数后,s的值并没有发生变化,仍然是指向a,所以输出结果为l,选项C正确。
编辑于 2015-02-03 17:47:00 回复(15)
  1. 答案是C
  2. 当调用fun(a,b,s);

    传进的参数实际上是:&a[0], &b[0], s变量的值(实际上也就是&a[0])

  3. 现在把fun的形参换个名字  fun(int *p1, int *p2, int *p3)

    进入fun时 p3 = s ,即p3 = &a[0].

    调用malloc时返回的值是一个int*,实际上 p3 = malloc返回的新指针p4

    *p3=*p1+*(p2++)   即  *p4=*p1+*(p2++); 

    p4并不是s,算出来的值赋值到malloc返回的指针p4指向的内存了。

  4. 若想p3(即s)拿到计算的值,把s=(int*)malloc(sizeof(int) );这句去掉即可得到11。


发表于 2015-09-04 20:20:02 回复(5)
 


    看下加上打印后的结果。
    在fun函数中,指针s实际上是实参s的一份拷贝。对指针s值得改变,并不会改变实参s的值。通过调用malloc,给指针s赋值上新的地址,之后对指针s所指向内存的修改不会对实参s所指向的内存产生影响。
    所以,fun函数执行后,对指针s的值和s所指向的内存不会产生任何影响。
发表于 2016-02-23 23:10:25 回复(2)
#include <stdio.h>
#include <stdlib.h>
void fun ( int ﹡pl,int ﹡p2,int ﹡s )
{    
// s = (int﹡) malloc(sizeof(int));   这行注释掉的结果是11,所以我觉得不是值传递的问题,而是s新在堆上新申请了内存   
﹡s = ﹡pl + ﹡(p2++ );                                        如果没有这句,*s是能改变a[1]的值得
}
main( )
{    int a [2] = {l,2],b [2] = {10,20},﹡s = a;   
fun (a,b,s);     
printf ( "%d \n", ﹡s);
} a [2] = {l,2],b [2] = {10,20},﹡s = a;    fun (a,b,s);     printf ( "%d \n", ﹡s);}
发表于 2015-08-19 21:26:35 回复(4)
注意看,s是一级指针,要修改1级指针就要用二级指针来解决~
发表于 2017-12-15 10:28:14 回复(0)
和值传递无关,这里fun()是对s所指向的内容在进行修改,若没有malloc那句,结果会改变的;这里malloc开辟了其他空间,造成fun中的s和main中的s的地址不一样
发表于 2017-07-13 10:59:36 回复(2)
首先得明白:实参变量和形参变量之间采用的数据传递是单向的“值传递”方式。指针变量做函数参数也要遵循这一规则。调用函数时不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
如果没有s = (int*) malloc(sizeof(int));输出值为11.
但是有了上面这一行,s就会被分配新的地址.相当于一开始s和a指向同一个内存空间,但是s开辟新空间后,s指向新空间和a就没有关系了。所以最后计算的新值是存放在新的空间里,并不是放在a的空间里。
发表于 2017-03-15 21:12:59 回复(1)
前缀递增递减和*优先级相同,从右到左;

后缀递增递减比前缀优先级高,从左到右。

比如

1
2
int arr[5] = { 1,3,5,7,9 };
int *p = arr;

*++p:p先自+,然后*p,最终为3

++*p:先*p,即arr[0]=1,然后再++,最终为2

*p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]

(*p)++:先*p,即arr[0]=1,然后1++,该语句执行完毕后arr[0] =2

*(p++):效果等同于*p++

发表于 2017-11-06 08:54:29 回复(0)
这是值传参,s传进去之后产生一个s的拷贝,属于局部变量,里面存有原来的指针地址,让这个局部变量s指向新的地址并不会改变原来的外面的s,所以原来的s指向的地址不变,而里面也没有对原来的s指向的内容进行修改,自然内容也不变。
发表于 2017-09-05 08:29:48 回复(1)
除非fun函数的s是二级指针,不然这仅仅只是传值操作,一开始的s确实等于数组a的首元素地址,但经过malloc函数动态分配内存之后,s就指向了新的内存单元,所以函数后面的p1 p2运算也根本不用看了,根本不会改变数组a的内容,因为地址都不一样,输出的时候直接输出的是数组a的首元素。很简单

发表于 2022-02-26 10:42:17 回复(0)
void fun ( int *pl,int *p2,int *s )
{
    printf("%d\n",s);
    s = (int*) malloc(sizeof(int));
    printf("%d\n",s);
    *s = *pl+*(p2++);
}
main( )
{
    int a[2]={1,2},b[2]={10,20},*s=a;
    printf("%d\n",s);
    fun (a,b,s);
    printf("%d\n",s);
    printf ( "%d \n", *s);
}

















发表于 2020-03-25 21:31:58 回复(0)
这种情况传入的指针只相当于普通情况下的值传递。原本的指针所指向的值不会发生改变。
发表于 2016-05-23 14:26:15 回复(0)
这道题传递参数的时候s是单向值传递没错,但是s是a中首元素地址的值, 是可以去更改a[0]中的值。但是在调用的函数中,malloc给s中的地址值重新赋值了,所以后面更改的不是a[0]的值。
发表于 2016-02-23 07:18:53 回复(0)
C
s = (int*) malloc(sizeof(int));
主要是这句,加上结果为1,因为此时虽然给指针s开辟了新空间,但是要改变指针,必须用指向指针的指针,所以这里并没有改变main()函数中指针的指向。
去掉后只是改变指针指向的内容,即数组中的int元素,结果为11.
发表于 2015-10-28 22:14:51 回复(3)
程序运行后的输出结果是 1。
实参s,形参s`,数组a
fun(a, b, s);
s`=s=a=&a[0];//把s保存的地址赋值给s`
fun(a, b, &s);
s`=&s=&a;//把s的地址复制给s`

原因是在fun()函数中,虽然传入了指针s的地址,但在函数内部对s进行动态内存分配并赋值后,并没有将分配的内存地址回传给main()函数中的指针s。因此,在main()函数中打印*s时,仍然输出的是初始的a数组中的第一个元素的值(即 1)。

具体来说,函数fun()中的语句s = (int *)malloc(sizeof(int));分配了一块动态内存,然后通过*s = *p1 + *(p2++);计算了p1指向的值和p2指向的值之和,并将结果赋值给了动态内存所指向的地址。但由于s是按值传递(在函数中只修改了拷贝),所以这个修改不会影响到main()函数中的指针s。

要在fun()函数中修改main()函数中的指针s,可以通过传递指向指针s的指针来实现。例如,函数原型可以改为void fun(int *p1, int *p2, int **s),而在函数内部进行动态内存分配和赋值的语句可以改为*s = (int *)malloc(sizeof(int));和**s = *p1 + *(p2++);。这样,指针s就会被修改,并且可以在main()函数中正确输出修改后的值。

编辑于 2023-11-09 14:34:54 回复(0)
malloc之后重新分配了内存给了形参的s,形参s之后对地址内容所有操作都是对那个malloc操作的
发表于 2023-08-02 16:32:20 回复(0)
fun函数中malloc在堆区申请了一个空间存储分配给s来存储*p1 + *(p2++)的结果,而main函数中的s是在栈区的空间,由于传递的不是二级指针,s任然是栈区的空间,故结果应该是1.
发表于 2021-11-16 19:18:42 回复(0)
首先说明函数里面s是进行指针的复制传递,函数刚开始的时候,main中的s和函数fun中的s指向同一个数,但是:
s = (int*) malloc(sizeof(int));
因为执行了这一句,s指向的位置已经不是main函数中s指向的位置,此时对fun中的s进行操作不能改变main中s指向的数值。
发表于 2017-07-04 09:34:46 回复(0)
 s = (int*) malloc(sizeof(int));
虽然是指针传递,但s为新节点,对s的操作不影响主函数的s
编辑于 2016-03-13 20:23:01 回复(0)
函数是值传递,在函数体内重新复制,改变后不影响函数外原变量。

发表于 2015-07-28 10:27:56 回复(0)
s传递的时候是把值传进函数里面的s,外面的s并未改变
发表于 2023-04-14 21:00:50 回复(0)