| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1387 人关注过本帖, 1 人收藏
标题:关于变量作用域的问题
只看楼主 加入收藏
Listen123
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-10-17
收藏
得分:0 
回复 10楼 pycansi
c没有引用吧,这个代码有问题,
2013-10-18 00:24
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
回复 11楼 Listen123
取地址


莫问前尘有愧,但求今生无悔
2013-10-18 06:54
ljx小子
Rank: 8Rank: 8
来 自:星星
等 级:蝙蝠侠
威 望:2
帖 子:222
专家分:916
注 册:2013-10-7
收藏
得分:0 
头文件应该是stdlib.h吧c库中malloc是在这个头文件中调用的

。。。。。。。。。。。
2013-10-18 07:41
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
回复 10楼 pycansi
形参和实参的地址是不一样的,而f函数结束后形参的内存是被释放了,所以实参的值并没有变,也就是说形参对实参没有影响,要改变实参的值应该传送实参的地址。这么说对吗?
2013-10-18 09:41
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:5 
#include<stdio.h>
#include<malloc.h>
void f(int * p)
{
    int * q=(int *)malloc(sizeof(int));
    printf("指针Q目前的地址是:%d\n",q);
    printf("指针Q目前的值是:%d\n",*q);
    * q=5;
    printf("指针Q目前的地址是:%d\n",q);
    printf("指针Q目前的值是:%d\n",*q);
    p=q;
    printf("指针P目前的地址是:%d\n",p);
    printf("指针P目前的值是:%d\n",*p);
    //printf("%d\n",* p);
    return;
}
int main(void)
{
    int * p=(int *)malloc(sizeof(int));
    printf("指针p目前的地址是:%d\n",p);
    printf("指针p目前的值是:%d\n",*p);
    f(p);
    printf("%d\n",* p);
    return 0;
}
指针p目前的地址是:3759712
指针p目前的值是:-842150451
指针Q目前的地址是:3748240
指针Q目前的值是:-842150451
指针Q目前的地址是:3748240
指针Q目前的值是:5
指针P目前的地址是:3748240
指针P目前的值是:5
指针p目前的值是:-842150451

太久不能C了,问题在于f(p);p的值传给参数int * p 了,这两个不是一个东西。
#include<stdio.h>
#include<malloc.h>
void f(int * *p)
{
    int * q=(int *)malloc(sizeof(int));
    printf("指针Q目前的地址是:%d\n",q);
    printf("指针Q目前的值是:%d\n",*q);
    * q=5;
    printf("指针Q目前的地址是:%d\n",q);
    printf("指针Q目前的值是:%d\n",*q);
    *p=q;
    printf("指针P目前的地址是:%d\n",*p);
    printf("指针P目前的值是:%d\n",**p);
    //printf("%d\n",* p);
    return;
}
int main(void)
{
    int * p=(int *)malloc(sizeof(int));
    printf("指针p目前的地址是:%d\n",p);
    printf("指针p目前的值是:%d\n",*p);
    f(&p);
    printf("指针p目前的值是:%d\n",* p);
    return 0;
}

指针p目前的地址是:3759712
指针p目前的值是:-842150451
指针Q目前的地址是:3748240
指针Q目前的值是:-842150451
指针Q目前的地址是:3748240
指针Q目前的值是:5
指针P目前的地址是:3748240
指针P目前的值是:5
指针p目前的值是:5

学习需要安静。。海盗要重新来过。。
2013-10-18 10:07
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
#include
#include
void f(int  *pNew,int ** pOldAddr)
{
    printf("pNew的地址%d,pOld的地址%d,两者是否相等%s",&pNew,pOldAddr,(&pNew==pOldAddr?"true":"false"));
    return;
}
int main(void)
{
    int * p=(int *)malloc(sizeof(int));
    f(p,&p);
    return 0;
}
pNew的地址1244808,pOld的地址1245024,两者是否相等false

学习需要安静。。海盗要重新来过。。
2013-10-18 10:27
继续奋斗
Rank: 1
等 级:新手上路
帖 子:7
专家分:8
注 册:2013-9-26
收藏
得分:0 
在f()函数中没有返回值,因此如果在主函数中没有赋值的话,执行程序时主程序将无法得到*q的值。
如果想通过这种形式得到该值的话,应该讲值定义为全局变量,也就是在f()外定义,或者在函数f()中返回值。
2013-10-18 10:53
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
回复 14楼 xiedj
这个因果有问题啊,实参变不变和形参释不释放无关,你要改变实参的值,就要对实参所在的内存区域进行改写


莫问前尘有愧,但求今生无悔
2013-10-18 11:33
pycansi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:418
专家分:1060
注 册:2012-7-26
收藏
得分:0 
不错,我喜欢这种理论的探讨
大堆大堆的代码看得头大


莫问前尘有愧,但求今生无悔
2013-10-18 11:40
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
也就是说形参和实参所在地址不同,要改变实参的值要么通过传递实参指针改变实参的值,或者通过函数返回值。
2013-10-18 14:14
快速回复:关于变量作用域的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031557 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved