首页 > 试题广场 >

在C语言中,以下代码执行之后,*ip的值为()

[单选题]
在C语言中,以下代码执行之后,*p的值为()
void func(int *p){
	static int num = 4;
	p = #
	(*p)--;
}
int main(){
	int i = 5;
	int *p = &i;
	func(p);
	printf("%d", *p);
	return 0;
}
  • 3
  • 4
  • 5
  • 以上都不是
在函数里,指针p又重新定位成num的地址空间,所以在函数中的自减是修改num的值;而当在main函数中的p指针依然指向 i 的地址空间,在func中没有被修改,那么值不变;
如果函数去掉num,如下:
void func(int *p)
{
(*p)--;
}
此时,就是修改 main函数中 i 的值了。

详细分析:

如上图,当调用函数的时候,形参指针p会指向实参指针p 所指向的地址空间;
在题目的 func 函数中,形参指针p 指向了新的地址空间num,如下图:

那么此时修改形参p 所指向地址空间的值,是不会影响 实参指针p和i 的值。

编辑于 2017-03-08 20:59:01 回复(3)
尽管函数的形参是指针,但是注意,它仍然是“值传递”
一方面,函数本身没有任何返回;另一方面,函数只是对p的值的处理,并非p的地址
函数调用时,p作实参,函数中也给p重新赋值,函数确实使静态局部变量num的值减1,但是函数执行完,返回到主函数中,p中的仍然是i的地址。
若要使得p指向num,需要对p的地址进行传递,此时:
void func(int **p)
{
    static int num = 4;
    *p = #
    (**p)--;
}
int main()
{
    int i = 5;
    int *p = &i;
    func(&p);
    printf("%d",*p);
    return 0;
}
执行结果:

发表于 2017-04-18 15:28:33 回复(4)
首先,main函数内:p指向i的地址。在fun函数传递的是p的值,p的值就是i的地址,因此传递的是i的地址。 其次,在fun函数内,形参p接收i的地址,此时形参p也指向i(同main函数内的实参p一样,此时有两个指针指向i)。之后,形参p指向静态变量num,这样形参修改的话修改的是num的值。而i只有main函数内的实参p指向,fun函数的p已经不指向i了。 因此,实参p没有改变,i也没有改变。
发表于 2018-04-26 13:14:44 回复(0)
P的值实际上没改变,只是改了num 的值
发表于 2016-12-30 10:38:27 回复(0)
答案是C
        传入的是形参P,当函数结束后悔自动销毁,所以还是5,当传入的是&p,函数用**p接收,那就不一样了
发表于 2016-12-21 16:17:21 回复(1)
楼上分析已经很详细了,两个函数对比运行一下
#include<stdio.h>
using namespace std;

void func(int *p)
{
    static int num = 4;
    p = &num;
    (*p)--;
}

void func1(int **p)
{
    static int num = 4;
    *p = &num;
    (**p)--;
}
int main()
{
    int i = 5;
    int *p = &i;

    func(p);
    printf("%d\n",*p);

    func1(&p);
    printf("%d",*p);
    return 0;
}


发表于 2021-10-25 20:51:59 回复(0)
发表于 2020-04-01 20:32:55 回复(0)
函数并没有返回值,在掉用完成后函数空间会被释放
发表于 2019-07-30 22:18:25 回复(0)
解说整那么复杂谁看得懂,应该是参数传递的是备份,不是参数本身,如果是传本身参数前面加&。所以复制品的指向改变了,原p没有参与函数,指向不变,简单吧
发表于 2023-02-21 13:15:53 回复(1)

形参是拷贝的。。

发表于 2019-10-09 08:50:10 回复(0)
本题存在迷惑条件,如多把func函数的形参p改成q就清楚多了。这样的话,调用func函数时会执行int *q=p;即定义一个整型指针q指向p,然后func函数里实际执行的跟p就没关系了。
发表于 2022-05-05 21:13:42 回复(0)
我来放个gdb截图你们就明白了,指针本身也是个整数,是按值传递的,注意看p的值

发表于 2018-08-05 14:34:28 回复(0)
在C和C++环境下,这段代码的结果是相同的。
这是因为在func函数中,参数p是一个指针的拷贝。当你在函数内部改变p的值时,这个改变不会影响到函数外部的p。
要在函数内部改变指针所指向的值,需要传递指针的引用(在C++中)或者传递指针的指针(在C和C++中)。
// C++
void func(int*& p){
    static int num = 4;
    p = &num;
    (*p)--;
}

// C and C++
void func(int** p){
    static int num = 4;
    *p = &num;
    (**p)--;
}


编辑于 2023-12-01 17:51:37 回复(0)
调用函数相当于又复制了一个p,函数里的新p指向num然后自减。但是这些操作不影响main函数中的p指向的内容
发表于 2023-08-24 23:25:27 回复(0)
评论看不懂,函数里不是*p吗,存的是地址那&num也是地址p里的地址已经改变了啊,就算离开函数那也是改变了啊,怎么到了主函数还是i的地址
发表于 2023-08-13 13:12:50 回复(0)
题目上面的函数func(p)是值传递,所以就算传参过去,它的值也不会有任何变化,还是原来的那个5;如果是取地址不一样了,会改变他的值,是3
发表于 2023-03-16 21:38:22 回复(0)
这里指针是传值传递,p是拷贝过去的形参
发表于 2022-09-30 17:08:07 回复(0)
在主函数调用func时将主函数的实参p赋值给了func里的形参p(形参p指向了i)。在func函数中p=&num;改变了形参p的指向。也就是说对*p的操作影响不到i了。在函数调用结束后,实参p仍指向i,此时i依然等于5,所以输出为5
发表于 2022-09-27 08:57:17 回复(0)
三个字:值传递!!!
发表于 2022-08-11 11:38:22 回复(0)
func函数中的形参*p是一个迷惑项,这个*p和main函数中的*p是两个指针,func中虽然指针改变了,且值发生了变化,但是不影响main函数中的指针p指向的i,所以*p的值还是5
发表于 2022-02-18 00:04:23 回复(0)