收录日期:2020/09/26 01:05:11 时间:2016/07/15 11:38:23 标签:C语言


以下程序段中,能够通过调用函数fun,使main函数中的指针变量p指向一个合法的整型单元的是:

A.main()

{

    int *p;

    fun(p);

............

}

int fun(int *p)

{

    int s;

    p=&s;

}

B.main()

{

    int *p;

    fun(&p);

...............

}

int fun(int **p)

{

    int s;

    *p=&s;

}

C.#include<stdlib.h>

main()

{

    int *p;

    fun(&p);

.................

}

int fun(int **p)

{

*p=(int *)malloc(2);

}

D.#include<stdlib.h>

main()

{

    int *p;

    fun(p);

.................

}

int fun(int *p)

{

p=(int *)malloc(sizeof(int));

}

选什么?为什么?大家能解释详细点吗?
 
ab 函数中的都是堆栈变量,传不出来的。


d中由于函数的参数采用的传值传递,要改变参数的值,要对参数取地址或者引用。



c
选2级指针那个
4
选 3
选C。
你要明确两个问题
1、传值还是传指针
int fun(int *p)(1)

int fun(int **p)(2)

main() 
{
int *p;  

调用(1)的时候用fun(p),传到fun里面的是main中p的一个拷贝,结果你在fun中不管如何改动p,main中的p一点没变
调用(2)的时候用fun(&p),传到fun中的是main中p的指针,你修改*p,也就是修改了main的p

2、
fun(int **p)
{
    int x;
    *p=&x;
}
这里定义的x是保存在栈中的,它只在fun有效,出了fun就要销毁了,所以不能这么做,而要动态申请
选2 应该
c
选C
注意分清值和地址的概念
指针本身是一个变量,要占用一定空间,这个空间用来存放其它变量的地址
一个指针指向一个变量,其实就是这个指针保存了那个变量的地址
为了方便解释,下面的例子和楼主的问题稍有不同,

main()
{
int a=10;
int *p;
p=&a;
fun(p);//p的值为0x1234
}

假设a的地址为:0x1234,P的地址为:0x1278
则在0x1278这个地址里面存放的数据是0x1234
调用fun(p)后,进入fun函数

fun(int *p)
{
     这里的p是fun函数的形参,编译器将会为它分配一个空间,相当于在fun函数里面的一个指针变量。
     它和main函数里面的p是两个不同的变量,占用的空间是不同的。假设是它的地址是0x1290
     这里的p与main函数里面的p存放的数据是相同的,都是0x1234,
     如果执行语句 *p=5;会使a的值变为5,因为a的地址就是0x1234
     执行:int s;p=&s;后(假如s的地址是0x1200),改变的是0x1290这个地址上的数据,0x1290的数据
     变为s的地址:0x1200,不会改变0x1278的数据,
     main函数里面p仍然指向0x1234这个空间,而不会指向fun函数里面s的地址
     因为main函数的p指向的空间不会改变,所以在fun函数里面分配空间不会影响到main函数里面的p
}

如果是这样:
main()
{
   int a=10;
   int *p=&a;
   fun(&p);//&p的值为0x1278
}

fun(int **p)
{
      这里的p是指向指针的指针
      这个p存放的数据是:0x1278,即是main函数里面p的地址
      执行int s;(*p)=&s;
      假如s的地址是:0x1100
      则这条语句会把:0x1278这个地址上的数据修改为0x1100,即是修改了main函数里面p指向的地址
      这里对p的操作会影响main函数里面p的指向
      但是由于s是fun函数里面的变量,s占用的是栈的空间,随着函数的返回,s占用的空间会被释放
      fun函数返回后,main函数仍然指向s的空间0x1100,但是0x1100这个空间已经被收回了,不是合法
      的空间
      如果是:*p=(int *)malloc(2); 
      因为malloc分配的空间在堆里,则函数返回后这段空间仍然是存在的,合法的      
}
选 C 喔
樓上的 zhhy123 大大 講的超清楚的喔
8楼的讲解得相当详细,赞一个。谢谢。
C

一个关于文本框控件的问题 急急... 菜鸟求救 如何将更新在datagrid 中的数据更新到数据库中去? 插入数据也出错? 希望与同仁共同分享爱、幸福、快乐与祝福——五一回老家结婚,放分 请问一个问题———是关于注册表的!!!!急急!!!! 那位大哥回答一下,怎么样让Jbuilder9支持jsp2.0 用于更新的触发器是怎么写的啊? 100分紧急求够 网络聊天室论文(b/s模式)有代码再加 关于使用文件代替数据库的问题 如何给TEXTBOX控件加CSS? 请问这样的触发器怎么写,高手进来看看! 如何很好的回答:Sqlserver的结构体系问题 请问Nothing和Dispose有何区别? 关于串口通讯的基础问题 关于Listview ,请大家帮帮忙! java的String类型数据无法入到数据库中的Date类型字段中 toolbar控件 OBJ文件怎麼使用 关于类,请大侠指教 人民的好儿女 为什么web服务器工作不稳定? HELP:JAVA设计一个文件加密和解密的应用程序 谁知道红双喜要如何写啊? 不小心删除表空间!!!!!! 各位使用excel 的高手们快帮帮我:如何在表格里输入一个17位的身份证号一后,不要用科学记数法来显示 晕死!不能上网,但网络肯定是没问题的 谁能破解掉这个论坛 asp代码在<%@ Language=JavaScript %>页面如何写 请问如何在vs.net下使用c++,