首页 > 试题广场 >

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

[单选题]

有以下程序

#include <stdio.h>
#include <string.h>
void fun(char *s) {
    char a[10];
    strcpy(a, "STRING");
    s = a;
}

main() {
    char *p = "PROGRAM";
    fun(p);
    printf("%s\n", p);
}



程序运行后的输出结果是(此处□代表空格)?

  • STRING
  • STRING□□□□
  • STRING□□□
  • PROGRAM
说错了,fun()是一个传址函数,传入的地址是原地址的复制,s=a改变了s的内容(如果在fun里面输出s,结果是STRING),但并没改变p的值,更没有改变其指向的内容。并不是上面说的妄图去改变p指向的字符串常量。
编辑于 2015-10-14 21:31:04 回复(10)
更多回答
推荐
本题考查字符串指针作为函数参数,本题中p作为字符串指针传入fun中,p指向的内容并没有发生变化,所以选项D正确。
编辑于 2015-02-03 17:24:28 回复(1)
看了下评论区,讲的挺玄乎的。其实没有这么复杂,有点懵的小伙伴只要记住传递指针的时候内存其实是对原指针做了复制就可以了。也就是说当p传入func后的操作,即对s的操作不是操作p,而是做了一个跟p一样的指针指向p罢了。所以如果是在指针上对子串修改是有效的,但是重新指定指向就不行了。大体意思我画了个示意图
                                                       
发表于 2018-03-16 10:19:44 回复(10)
改变非指针变量,需要指针,来传递其地址,改变一级指针需要二级指针来接受其地址。
发表于 2016-06-04 23:30:39 回复(0)

#include<iostream>

using namespace std;

void test(char *p)

{
p="B";
}

int main()

{

char p[10]="A";

 test(p);

 cout<<p;
}

为什么输出的不是B

由于函数声明为void test(char *p); 这种是传值参数,
当进行test(p);函数调用时,实参p把它的值,也就是字
符串常量"A"的首地址赋值给了形参p,但注意这是形参p
是实参p的一个副本,而不是实参p的引用。当执行p="B";时,
形参p的值就被改写为字符串常量"B"的首地址,但实参p和形
p是两个独立的变量,因此对形参p的修改不会影响到实参p
所以实参p的值仍然是字符串常量"A"的首地址。由于形参p的作
用域是在test函数内,所以当test调用结束,形参p也会被释放
掉。当执行cout<<p;是输出的是指向字符数组的首地址指针的值
,由于test函数没有改变字符数组的值,所以输出A而不是B

如果你想输出B的话,可以把函数改为

void test(char *&p)

{
p="B";

}

这是用引用的方式传值。


编辑于 2017-10-25 18:51:55 回复(3)
p是什么类型?char* 。s是什么类型char* 。fun(p)到fun(char* s)过程只是一个值传递的过程,只不过这个值是一个地址值(形如0x12345678)。
发表于 2016-12-09 22:29:00 回复(0)
s和p都指向"PROGRAM",当进行s=a后,s指向数组a,和"PROGRAM"内存块没有任何关系,p所指的内存空间的内容没有任何改变!
发表于 2016-08-11 00:29:04 回复(0)
函数里的形参s只是实参p的一个复制
发表于 2015-07-27 12:05:48 回复(0)
实参到形参是值传递的形式,系统会专门给形参开辟空间,所以形参和实参是两个不同的储存单元,形参不能改变实参,实参可以改变形参,对于指针变量,地址不会改变,但是地址里面储存的数值可以改变。
发表于 2017-04-11 19:31:06 回复(0)
这么说吧,你要想改变指向,就传二级指针,然后取星号,这个和你传一级指针取星号一个道理
发表于 2019-08-22 23:39:58 回复(0)
实参到形参是值传递的形式,系统会专门给形参开辟空间,所以形参和实参是两个不同的储存单元,形参不能改变实参,实参可以改变形参,对于指针变量,地址不会改变,但是地址里面储存的数值可以改变。 s和p都指向"PROGRAM",当进行s=a后,s指向数组a,和"PROGRAM"内存块没有任何关系,p所指的内存空间的内容没有任何改变!
发表于 2019-07-01 15:31:21 回复(0)
二级指针才能改变 p
发表于 2023-07-20 15:13:43 回复(0)
值传递哥哥们,形参改变不影响实参

发表于 2022-08-11 10:55:49 回复(0)
fun(p) 函数其实是将p的指针复制一份,也就是作为void fun(char *s)的形参s,而在函数里s的指向确实被修改为和a指向一样,指向a的首地址,但他作为一份复制的指针,不影响原来的指针p的指向,所以p还指向program的首地址。
发表于 2022-03-22 10:36:54 回复(0)
那块地址函数返回之后就被释放了,直接改数据不对,解决方法两个,数组用全局的或者写成静态的。
发表于 2022-03-12 14:23:32 回复(0)

指针传递本质也是值传递(传递的值是指针所指向的地址),而值传递其实是传递了一个副本(这个副本是栈中开辟的一个新空间放的实参的值),所以对传递的指针的值(一个地址)改变值(另一个地址) 实参(即原指针)并没有任何改变,而指针传递可以通过这个值(地址)的指向的改变 改变原指针指向的值。

发表于 2019-04-06 09:41:37 回复(0)
#include<stdio.h> #include<string.h> void fun(char *s)//s是main中p的拷贝,s和p都指向“hello”
{  char a[10];  strcpy(a, "STRING");  s = a; //只能改变s,无法改变main中p的指向  printf("%s\n", s); }//子函数结束后,s消失,p并没有改变
int main() {  char *p = "hello";  char a[10] = "hello";  fun(p);  printf("%s\n", p); //strcpy(p, "STRING"); //无法修改*p = "hello"的内容  strcpy(a, "STRING"); //字符数组可以修改  printf("%s\n", a); }

编辑于 2018-12-26 16:44:05 回复(0)
好意外啊,原来形参是指针类型变量的时候,传进去的竟然是地址的副本
发表于 2016-06-09 10:38:09 回复(0)
实参到形参是值传递的形式,系统会专门给形参开辟空间,所以形参和实参是两个不同的储存单元,形参不能改变实参,实参可以改变形参,对于指针变量,地址不会改变,但是地址里面储存的数值可以改变。
实际上是s是p复制过去的,所以只改变了s,没有改变p
发表于 2024-02-29 11:52:54 回复(0)
复制,但不影响本体
发表于 2022-11-14 09:38:17 回复(0)
#include <stdio.h>
#include <string.h>
char* fun(char *s) {
	char a[10];
	strcpy(a, "STRING");
	s = a;
	return s;
}

main() {
	char *p = "PROGRAM";
	p=fun(p);
	printf("%s\n", p);
}



这样写的话就可以输出“STRING”了
发表于 2022-03-05 11:15:17 回复(0)