收录日期:2020/02/20 19:48:39 时间: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

无刷新的问题。 如何在Excel文件打开的情况下用C#再次打开? TC3.0,每个下拉菜单的选项后,多出一个奇怪地小方框,不知如何去掉! java小程序—总共创建了多少个对象! 最终使用到了几个? Incorrect string value: \'\\xBC\\xD3\\xCB\\xD9\\xD2\\xB3...\' 无语的错误 关于系统业务数据自动节转导入NC的问题,希望有人帮忙解答。。。谢谢! JAVA中的return语句。。。。。。。。 关于WU_Line 反走样算法的 求救,为什么我在jsp中找不到javabean 星期六12点多将手机丢士车上,下午3点钟发现手机不见之后,随后多次拨打一直打不通,刚才通过网上查话费清单,发现了一个打出去的电话 求一份MDI代码 TreeView 判断点击是否为节点 荐【电子商务专业学生何处就业】——电子商务专业朋友...??? 有时在应用中,在前台需要用勾选的方式来选择一些记录,但又不想在表结构中创建一个逻辑字段。请问大家是如何处理的。 孔子为何对女人说粗话?【转】 winform问题 关于归并排序的问题,算法对,就是程序有个地方搞不明白 乌龟老大在吧,请教一个问题 改变外观的第三方控件 使用DataGridView更新Access数据库的错误 关于ACCESS数据库,防止被修改 combox添加数据不能显示 CPU烤袜子,对机器有何伤害? boost::asio::ip::tcp的校验和问题 Jsp页面跳转没有反应(搞的我头的大了,高手帮帮我吧) 丁磊始终坚信“财富实在是太重要了”“财富不仅能带来自信,还可以带来生活的尊严。”他以为“一个男人首先要有经济基础,才能保证未来的生活美满幸福。” Eclipse代码提示的问题 救命啊,各大侠请帮忙看一下这代码阿!, vista 连接远程数据库很慢 升级脚本报错,求高手帮忙